在 Bun 中使用 Drizzle ORM
Drizzle 是一个支持类 SQL “查询构建器” API 和类 ORM 查询 API 的 ORM。它支持内置模块 bun:sqlite。
使用 bun init 创建一个全新的项目,并安装 Drizzle。
terminal
bun init -y
bun add drizzle-orm
bun add -D drizzle-kit
然后使用 bun:sqlite 模块连接到 SQLite 数据库,并创建 Drizzle 数据库实例。
import { drizzle } from "drizzle-orm/bun-sqlite";
import { Database } from "bun:sqlite";
const sqlite = new Database("sqlite.db");
export const db = drizzle({ client: sqlite });
为了查看数据库的实际效果,向 index.ts 添加以下代码。
import { db } from "./db";
import { sql } from "drizzle-orm";
const query = sql`select "hello world" as text`;
const result = db.all<{ text: string }>(query);
console.log(result);
然后使用 Bun 运行 index.ts。Bun 会创建 sqlite.db 并执行查询。
terminal
bun run index.ts
Text
[
{
text: "hello world",
}
]
现在为数据库添加架构。创建一个 schema.ts 文件,并定义一个 movies 表。
import { sqliteTable, text, integer } from "drizzle-orm/sqlite-core";
export const movies = sqliteTable("movies", {
id: integer("id").primaryKey(),
title: text("name"),
releaseYear: integer("release_year"),
});
使用 drizzle-kit CLI 生成初始 SQL 迁移。
terminal
bunx drizzle-kit generate --dialect sqlite --schema ./schema.ts
该命令会创建一个 drizzle 目录,其中包含一个 .sql 迁移文件和一个 meta 目录。
文件树
drizzle
├── 0000_ordinary_beyonder.sql
└── meta
├── 0000_snapshot.json
└── _journal.json
使用 migrate.ts 脚本执行这些迁移。它会连接到 sqlite.db,然后执行 drizzle 目录中所有尚未执行的迁移。
import { migrate } from "drizzle-orm/bun-sqlite/migrator";
import { drizzle } from "drizzle-orm/bun-sqlite";
import { Database } from "bun:sqlite";
const sqlite = new Database("sqlite.db");
const db = drizzle({ client: sqlite });
migrate(db, { migrationsFolder: "./drizzle" });
使用 bun 运行该脚本以执行迁移。
terminal
bun run migrate.ts
现在向数据库中添加一些数据。创建一个 seed.ts 文件,内容如下。
import { db } from "./db";
import * as schema from "./schema";
await db.insert(schema.movies).values([
{
title: "The Matrix",
releaseYear: 1999,
},
{
title: "The Matrix Reloaded",
releaseYear: 2003,
},
{
title: "The Matrix Revolutions",
releaseYear: 2003,
},
]);
console.log(`Seeding complete.`);
然后运行该文件。
terminal
bun run seed.ts
Text
Seeding complete.
现在数据库已经拥有架构和一些示例数据。将 index.ts 的内容替换为以下代码,使用 Drizzle 查询数据库。
import * as schema from "./schema";
import { db } from "./db";
const result = await db.select().from(schema.movies);
console.log(result);
然后运行该文件。你应该会看到刚刚插入的三部电影。
terminal
bun run index.ts
Text
[
{
id: 1,
title: "The Matrix",
releaseYear: 1999,
}, {
id: 2,
title: "The Matrix Reloaded",
releaseYear: 2003,
}, {
id: 3,
title: "The Matrix Revolutions",
releaseYear: 2003,
}
]
请参阅 Drizzle 文档。