Skip to content

Commit

Permalink
feat: Add prisma sample for javascript
Browse files Browse the repository at this point in the history
  • Loading branch information
dengfuping committed Oct 31, 2024
1 parent beeb74f commit 474260f
Show file tree
Hide file tree
Showing 8 changed files with 446 additions and 0 deletions.
7 changes: 7 additions & 0 deletions javascript/prisma/.env
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
# Environment variables declared in this file are automatically made available to Prisma.
# See the documentation for more detail: https://pris.ly/d/prisma-schema#accessing-environment-variables-from-the-schema

# ⚠️⚠️ Attention ⚠️⚠️
# You should keep .env out of version control to avoid security risks

DATABASE_URL="mysql://username:password@localhost:3306/test?prefer_socket=false"
1 change: 1 addition & 0 deletions javascript/prisma/.gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
node_modules
114 changes: 114 additions & 0 deletions javascript/prisma/README-CN.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,114 @@
# Prisma 连接 OceanBase 指南

[English](README.md) | 简体中文

本文介绍如何通过 [Prisma](https://www.prisma.io) 连接 [OceanBase](https://www.oceanbase.com) 数据库。

## 准备工作

确保 Nodejs 和 npm 已经安装。

## 项目配置

拉取项目并进入相应目录:

```bash
git clone [email protected]:oceanbase/ob-samples.git
cd javascript/prisma
```

全局配置环境变量 (原因详见 https://open.oceanbase.com/blog/15137753618):

```bash
export PRISMA_ENGINES_MIRROR=https://oceanbase-prisma-builds.s3.ap-southeast-1.amazonaws.com
export BINARY_DOWNLOAD_VERSION=96fa66f2f130d66795d9f79dd431c678a9c7104e
```

安装依赖 (注意 `prisma``@prisma/client` 版本在 `^5.20.0` 及以上):

```bash
npm install
```

修改 `.env` 中的数据库连接串,格式如下。注意需要设置 `prefer_socket=false`,以避免和 OceanBase 建立连接时报错。

```bash
DATABASE_URL="mysql://username:password@localhost:3306/test?prefer_socket=false"
```

执行以下命令,将 `prisma/schema.prisma` 中定义的 `User``Post``Profile` 数据模型同步到 OceanBase 数据库中:

```bash
npx prisma migrate dev --name init
```

```sql
mysql> show tables;
+--------------------+
| Tables_in_test |
+--------------------+
| _prisma_migrations |
| posts |
| profiles |
| users |
+--------------------+
4 rows in set (0.02 sec)
```

使用命令行执行 `index.ts` 中的示例代码:

```bash
npx ts-node index.ts
```

输出以下内容,说明执行成功:

```bash
[
{
id: 1,
email: '[email protected]',
name: 'Alice',
posts: [
{
id: 1,
createdAt: 2024-10-31T04:33:45.535Z,
updatedAt: 2024-10-31T04:33:45.535Z,
title: 'Hello World',
content: null,
published: false,
authorId: 1
}
],
profile: { id: 1, bio: 'I like turtles', userId: 1 }
}
]
```
查看对应的 `users``posts``profiles` 表,数据已正常插入:
```bash
mysql> select * from users;
+----+---------------------+-------+
| id | email | name |
+----+---------------------+-------+
| 1 | [email protected] | Alice |
+----+---------------------+-------+
1 row in set (0.01 sec)

mysql> select * from posts;
+----+-------------------------+-------------------------+-------------+---------+-----------+----------+
| id | createdAt | updatedAt | title | content | published | authorId |
+----+-------------------------+-------------------------+-------------+---------+-----------+----------+
| 1 | 2024-10-31 04:33:45.535 | 2024-10-31 04:33:45.535 | Hello World | NULL | 0 | 1 |
+----+-------------------------+-------------------------+-------------+---------+-----------+----------+
1 row in set (0.01 sec)

mysql> select * from profiles;
+----+----------------+--------+
| id | bio | userId |
+----+----------------+--------+
| 1 | I like turtles | 1 |
+----+----------------+--------+
1 row in set (0.01 sec)
```
114 changes: 114 additions & 0 deletions javascript/prisma/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,114 @@
# Connect to OceanBase with Prisma

English | [简体中文](README-CN.md)

This document describes how to connect to [OceanBase](https://www.oceanbase.com) with [Prisma](https://www.prisma.io).

## Preparation

Make sure `Node.js` and `npm` are installed.

## Configuration

Clone the project and navigate to the appropriate directory:

```bash
git clone [email protected]:oceanbase/ob-samples.git
cd javascript/prisma
```

Set the global environment variables (for reasons see https://open.oceanbase.com/blog/15137753618):

```bash
export PRISMA_ENGINES_MIRROR=https://oceanbase-prisma-builds.s3.ap-southeast-1.amazonaws.com
export BINARY_DOWNLOAD_VERSION=96fa66f2f130d66795d9f79dd431c678a9c7104e
```

Install dependencies (note that the versions of `prisma` and `@prisma/client` should be `^5.20.0` or higher):

```bash
npm install
```

Modify the connection string in the `.env` file, formatted as follows. Note that `prefer_socket=false` must be set to avoid errors when connecting to OceanBase.

```bash
DATABASE_URL="mysql://username:password@localhost:3306/test?prefer_socket=false"
```

Execute the following command to synchronize the `User`, `Post` and `Profile` data models defined in `prisma/schema.prisma` to the OceanBase:

```bash
npx prisma migrate dev --name init
```

```sql
mysql> show tables;
+--------------------+
| Tables_in_test |
+--------------------+
| _prisma_migrations |
| posts |
| profiles |
| users |
+--------------------+
4 rows in set (0.02 sec)
```

Execute `index.ts` from the command line:

```bash
npx ts-node index.ts
```

The output should be as follows, indicating successful execution:

```bash
[
{
id: 1,
email: '[email protected]',
name: 'Alice',
posts: [
{
id: 1,
createdAt: 2024-10-31T04:33:45.535Z,
updatedAt: 2024-10-31T04:33:45.535Z,
title: 'Hello World',
content: null,
published: false,
authorId: 1
}
],
profile: { id: 1, bio: 'I like turtles', userId: 1 }
}
]
```
Check the corresponding `users`, `posts` and `profiles` tables and the data has been inserted correctly:
```bash
mysql> select * from users;
+----+---------------------+-------+
| id | email | name |
+----+---------------------+-------+
| 1 | [email protected] | Alice |
+----+---------------------+-------+
1 row in set (0.01 sec)

mysql> select * from posts;
+----+-------------------------+-------------------------+-------------+---------+-----------+----------+
| id | createdAt | updatedAt | title | content | published | authorId |
+----+-------------------------+-------------------------+-------------+---------+-----------+----------+
| 1 | 2024-10-31 04:33:45.535 | 2024-10-31 04:33:45.535 | Hello World | NULL | 0 | 1 |
+----+-------------------------+-------------------------+-------------+---------+-----------+----------+
1 row in set (0.01 sec)

mysql> select * from profiles;
+----+----------------+--------+
| id | bio | userId |
+----+----------------+--------+
| 1 | I like turtles | 1 |
+----+----------------+--------+
1 row in set (0.01 sec)
```
36 changes: 36 additions & 0 deletions javascript/prisma/index.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
import { PrismaClient } from "@prisma/client";

const prisma = new PrismaClient();

async function main() {
await prisma.user.create({
data: {
name: "Alice",
email: "[email protected]",
posts: {
create: { title: "Hello World" },
},
profile: {
create: { bio: "I like turtles" },
},
},
});

const allUsers = await prisma.user.findMany({
include: {
posts: true,
profile: true,
},
});
console.dir(allUsers, { depth: null });
}

main()
.then(async () => {
await prisma.$disconnect();
})
.catch(async (e) => {
console.error(e);
await prisma.$disconnect();
process.exit(1);
});
21 changes: 21 additions & 0 deletions javascript/prisma/package.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
{
"name": "prisma",
"version": "1.0.0",
"main": "index.js",
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1"
},
"keywords": [],
"author": "",
"license": "ISC",
"description": "",
"devDependencies": {
"@types/node": "^22.8.4",
"prisma": "^5.21.1",
"ts-node": "^10.9.2",
"typescript": "^5.6.3"
},
"dependencies": {
"@prisma/client": "^5.21.1"
}
}
43 changes: 43 additions & 0 deletions javascript/prisma/prisma/schema.prisma
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
// This is your Prisma schema file,
// learn more about it in the docs: https://pris.ly/d/prisma-schema

generator client {
provider = "prisma-client-js"
}

datasource db {
provider = "mysql"
url = env("DATABASE_URL")
}

model Post {
id Int @id @default(autoincrement())
createdAt DateTime @default(now())
updatedAt DateTime @updatedAt
title String @db.VarChar(255)
content String?
published Boolean @default(false)
author User @relation(fields: [authorId], references: [id])
authorId Int
@@map("posts")
}

model Profile {
id Int @id @default(autoincrement())
bio String?
user User @relation(fields: [userId], references: [id])
userId Int @unique
@@map("profiles")
}

model User {
id Int @id @default(autoincrement())
email String @unique
name String?
posts Post[]
profile Profile?
@@map("users")
}
Loading

0 comments on commit 474260f

Please sign in to comment.