diff --git a/applications/drizzle/.env b/applications/drizzle/.env new file mode 100644 index 0000000..47fb61f --- /dev/null +++ b/applications/drizzle/.env @@ -0,0 +1 @@ +DATABASE_URL="mysql://username:password@localhost:3306/test" \ No newline at end of file diff --git a/applications/drizzle/README-CN.md b/applications/drizzle/README-CN.md new file mode 100644 index 0000000..92005ed --- /dev/null +++ b/applications/drizzle/README-CN.md @@ -0,0 +1,60 @@ +# 使用 Drizzle 连接 OceanBase + +[English](README.md) | 简体中文 + +本文介绍如何通过 [Drizzle](https://orm.drizzle.team) 连接 [OceanBase](https://www.oceanbase.com) 数据库。 + +## 准备工作 + +确保 Node.js 和 npm 已经安装。 + +## 项目使用 + +拉取项目并进入相应目录: + +```bash +git clone git@github.com:oceanbase/ob-samples.git +cd javascript/drizzle +``` + +安装依赖: + +```bash +npm install +``` + +修改 `.env` 中的数据库连接串: + +```bash +DATABASE_URL="mysql://username:password@localhost:3306/test" +``` + +将 `db/schema.ts` 中定义的 `users` 模型同步到数据库中: + +```bash +npx drizzle-kit push +``` + +执行 `index.ts` 中的示例代码: + +```bash +npx ts-node index.ts +``` + +输出以下内容,说明执行成功: + +```bash +[ { id: 1, email: 'alice@oceanbase.com', name: 'Alice' } ] +``` + +查看对应的 `users` 表,数据已正常插入: + +```bash +mysql> select * from users; ++----+---------------------+-------+ +| id | email | name | ++----+---------------------+-------+ +| 1 | alice@oceanbase.com | Alice | ++----+---------------------+-------+ +1 row in set (0.01 sec) +``` diff --git a/applications/drizzle/README.md b/applications/drizzle/README.md new file mode 100644 index 0000000..ffe857c --- /dev/null +++ b/applications/drizzle/README.md @@ -0,0 +1,60 @@ +# Connect to OceanBase with Drizzle + +English | [简体中文](README-CN.md) + +This document describes how to connect to [OceanBase](https://www.oceanbase.com) with [Drizzle](https://orm.drizzle.team). + +## Preparation + +Make sure `Node.js` and `npm` are installed. + +## Usage + +Clone the project and navigate to the appropriate directory: + +```bash +git clone git@github.com:oceanbase/ob-samples.git +cd javascript/drizzle +``` + +Install dependencies: + +```bash +npm install +``` + +Modify the connection string in the `.env` file: + +```bash +DATABASE_URL="mysql://username:password@localhost:3306/test" +``` + +Synchronize the `users` model defined in `db/schema.ts` to the database: + +```bash +npx drizzle-kit push +``` + +Execute `index.ts`: + +```bash +npx ts-node index.ts +``` + +The output should be as follows, indicating successful execution: + +```bash +[ { id: 1, email: 'alice@oceanbase.com', name: 'Alice' } ] +``` + +Check the corresponding `users` table and the data has been inserted: + +```bash +mysql> select * from users; ++----+---------------------+-------+ +| id | email | name | ++----+---------------------+-------+ +| 1 | alice@oceanbase.com | Alice | ++----+---------------------+-------+ +1 row in set (0.01 sec) +``` diff --git a/applications/drizzle/db/schema.ts b/applications/drizzle/db/schema.ts new file mode 100644 index 0000000..a3d2df0 --- /dev/null +++ b/applications/drizzle/db/schema.ts @@ -0,0 +1,7 @@ +import { mysqlTable, serial, varchar } from "drizzle-orm/mysql-core"; + +export const usersTable = mysqlTable("users", { + id: serial().primaryKey(), + email: varchar({ length: 255 }).notNull().unique(), + name: varchar({ length: 255 }).notNull(), +}); diff --git a/applications/drizzle/drizzle.config.ts b/applications/drizzle/drizzle.config.ts new file mode 100644 index 0000000..00facc4 --- /dev/null +++ b/applications/drizzle/drizzle.config.ts @@ -0,0 +1,11 @@ +import "dotenv/config"; +import { defineConfig } from "drizzle-kit"; + +export default defineConfig({ + out: "./drizzle", + schema: "./db/schema.ts", + dialect: "mysql", + dbCredentials: { + url: process.env.DATABASE_URL!, + }, +}); diff --git a/applications/drizzle/index.ts b/applications/drizzle/index.ts new file mode 100644 index 0000000..abb8e76 --- /dev/null +++ b/applications/drizzle/index.ts @@ -0,0 +1,24 @@ +import "dotenv/config"; +import { drizzle } from "drizzle-orm/mysql2"; +import { usersTable } from "./db/schema"; + +const db = drizzle(process.env.DATABASE_URL!); + +async function main() { + const user: typeof usersTable.$inferInsert = { + name: "Alice", + email: "alice@oceanbase.com", + }; + await db.insert(usersTable).values(user); + + const allUsers = await db.select().from(usersTable); + console.log(allUsers); +} + +main() + .then(() => { + process.exit(0); + }) + .catch((err) => { + console.log(err); + }); diff --git a/applications/drizzle/package.json b/applications/drizzle/package.json new file mode 100644 index 0000000..a29ed56 --- /dev/null +++ b/applications/drizzle/package.json @@ -0,0 +1,23 @@ +{ + "name": "drizzle", + "version": "1.0.0", + "main": "index.js", + "scripts": { + "test": "echo \"Error: no test specified\" && exit 1" + }, + "keywords": [], + "author": "", + "license": "ISC", + "description": "", + "dependencies": { + "dotenv": "^16.4.5", + "drizzle-orm": "^0.36.0", + "mysql2": "^3.11.3" + }, + "devDependencies": { + "@types/node": "^22.8.5", + "drizzle-kit": "^0.27.0", + "ts-node": "^10.9.2", + "typescript": "^5.6.3" + } +} diff --git a/applications/drizzle/tsconfig.json b/applications/drizzle/tsconfig.json new file mode 100644 index 0000000..b847cca --- /dev/null +++ b/applications/drizzle/tsconfig.json @@ -0,0 +1,13 @@ +{ + "compilerOptions": { + "target": "es2016", + "experimentalDecorators": true, + "emitDecoratorMetadata": true, + "module": "commonjs", + "esModuleInterop": true, + "forceConsistentCasingInFileNames": true, + "strict": true, + "strictPropertyInitialization": false, + "skipLibCheck": true + } +}