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 Dec 2, 2024
1 parent beeb74f commit 2e16005
Show file tree
Hide file tree
Showing 11 changed files with 468 additions and 14 deletions.
21 changes: 13 additions & 8 deletions .github/workflows/basic-workflow.yml
Original file line number Diff line number Diff line change
Expand Up @@ -6,16 +6,20 @@ on:
module:
type: string
required: true
description: 'The name of sample project.'
description: "The name of sample project."
language:
type: string
required: true
description: 'The programming language used by the sample project.'
description: "The programming language used by the sample project."
with_oceanbase_container:
type: boolean
required: false
description: 'Whether to use a pre-deployed OceanBase container in CI workflow.'
description: "Whether to use a pre-deployed OceanBase container in CI workflow."
default: true
oceanbase_image_tag:
type: string
required: false
description: "The tag of OceanBase CE Docker image."

concurrency:
group: basic-ci-${{ github.event.pull_request.number || github.ref }}-${{ inputs.module }}
Expand All @@ -31,14 +35,14 @@ jobs:
if: ${{ inputs.language == 'golang' }}
uses: actions/setup-go@v4
with:
go-version: '1.20'
go-version: "1.20"
- name: Setup Java env
if: ${{ inputs.language == 'java' }}
uses: actions/setup-java@v4
with:
java-version: '8'
distribution: 'zulu'
cache: 'maven'
java-version: "8"
distribution: "zulu"
cache: "maven"
- name: Setup Python env
if: ${{ inputs.language == 'python' }}
uses: actions/setup-python@v4
Expand All @@ -54,7 +58,8 @@ jobs:
if: ${{ inputs.with_oceanbase_container }}
uses: oceanbase/setup-oceanbase-ce@v1
with:
network: 'host'
network: "host"
image_tag: ${{ inputs.oceanbase_image_tag || 'latest' }}
- name: Run sample for ${{ inputs.module }}
run: |
cd ${{ inputs.language }}/${{ inputs.module }} || exit
Expand Down
16 changes: 10 additions & 6 deletions .github/workflows/javascript.yml
Original file line number Diff line number Diff line change
Expand Up @@ -3,22 +3,26 @@ name: JavaScript CI
on:
push:
paths:
- '.github/workflows/javascript.yml'
- 'javascript/**'
- ".github/workflows/javascript.yml"
- "javascript/**"
pull_request:
paths:
- '.github/workflows/javascript.yml'
- 'javascript/**'
- ".github/workflows/javascript.yml"
- "javascript/**"

jobs:
ci:
strategy:
matrix:
module:
- name: 'mysql2'
- name: "mysql2"
with_oceanbase_container: true
- name: "prisma"
with_oceanbase_container: true
oceanbase_image_tag: "4.2.2"
uses: ./.github/workflows/basic-workflow.yml
with:
language: 'javascript'
language: "javascript"
module: ${{ matrix.module.name }}
with_oceanbase_container: ${{ matrix.module.with_oceanbase_container }}
oceanbase_image_tag: ${{ matrix.module.oceanbase_image_tag }}
1 change: 1 addition & 0 deletions javascript/prisma/.env
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
DATABASE_URL="mysql://root:@127.0.0.1:2881/test?prefer_socket=false&a=.psdb.cloud"
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://root:@127.0.0.1:2881/test?prefer_socket=false&a=.psdb.cloud"
```

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

```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://root:@127.0.0.1:2881/test?prefer_socket=false&a=.psdb.cloud"
```

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

```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`:

```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:
```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"
}
}
Loading

0 comments on commit 2e16005

Please sign in to comment.