> ## Documentation Index
> Fetch the complete documentation index at: https://bun.ll1025.cn/llms.txt
> Use this file to discover all available pages before exploring further.

# 使用 Drizzle ORM 与 Bun

Drizzle 是一个 ORM，支持类似 SQL 的"查询构建器"API 和类似 ORM 的[查询 API](https://orm.drizzle.team/docs/rqb)。它支持 `bun:sqlite` 内置模块。

***

使用 `bun init` 创建一个新项目并安装 Drizzle。

```sh terminal icon="terminal" theme={null}
bun init -y
bun add drizzle-orm
bun add -D drizzle-kit
```

***

然后使用 `bun:sqlite` 模块连接到 SQLite 数据库并创建 Drizzle 数据库实例。

```ts db.ts icon="https://mintcdn.com/span-inc/82N53aP7NFbaCVSl/icons/typescript.svg?fit=max&auto=format&n=82N53aP7NFbaCVSl&q=85&s=787d39d6a7d96d7f9540dc74344eba23" theme={null}
import { drizzle } from "drizzle-orm/bun-sqlite";
import { Database } from "bun:sqlite";

const sqlite = new Database("sqlite.db");
export const db = drizzle(sqlite);
```

***

要查看数据库的实际运行效果，将以下内容添加到 `index.ts`。

```ts index.ts icon="https://mintcdn.com/span-inc/82N53aP7NFbaCVSl/icons/typescript.svg?fit=max&auto=format&n=82N53aP7NFbaCVSl&q=85&s=787d39d6a7d96d7f9540dc74344eba23" theme={null}
import { db } from "./db";
import { sql } from "drizzle-orm";

const query = sql`select "hello world" as text`;
const result = db.get<{ text: string }>(query);
console.log(result);
```

***

然后使用 Bun 运行 `index.ts`。Bun 会创建 `sqlite.db` 并执行查询。

```sh terminal icon="terminal" theme={null}
bun run index.ts
```

```txt theme={null}
{
  text: "hello world"
}
```

***

现在为数据库定义模式。创建一个 `schema.ts` 文件并定义一个 `movies` 表。

```ts schema.ts icon="https://mintcdn.com/span-inc/82N53aP7NFbaCVSl/icons/typescript.svg?fit=max&auto=format&n=82N53aP7NFbaCVSl&q=85&s=787d39d6a7d96d7f9540dc74344eba23" theme={null}
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 迁移。

```sh terminal icon="terminal" theme={null}
bunx drizzle-kit generate --dialect sqlite --schema ./schema.ts
```

***

该命令会创建一个 `drizzle` 目录，其中包含一个 `.sql` 迁移文件和一个 `meta` 目录。

```txt 文件树 icon="folder-tree" theme={null}
drizzle
├── 0000_ordinary_beyonder.sql
└── meta
    ├── 0000_snapshot.json
    └── _journal.json
```

***

使用 `migrate.ts` 脚本执行这些迁移。它连接到 `sqlite.db`，然后执行 `drizzle` 目录中所有未执行的迁移。

```ts migrate.ts icon="https://mintcdn.com/span-inc/82N53aP7NFbaCVSl/icons/typescript.svg?fit=max&auto=format&n=82N53aP7NFbaCVSl&q=85&s=787d39d6a7d96d7f9540dc74344eba23" theme={null}
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(sqlite);
migrate(db, { migrationsFolder: "./drizzle" });
```

***

使用 `bun` 运行该脚本以执行迁移。

```sh terminal icon="terminal" theme={null}
bun run migrate.ts
```

***

现在向数据库添加一些数据。创建一个包含以下内容的 `seed.ts` 文件。

```ts seed.ts icon="https://mintcdn.com/span-inc/82N53aP7NFbaCVSl/icons/typescript.svg?fit=max&auto=format&n=82N53aP7NFbaCVSl&q=85&s=787d39d6a7d96d7f9540dc74344eba23" theme={null}
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(`种子数据完成。`);
```

***

然后运行此文件。

```sh terminal icon="terminal" theme={null}
bun run seed.ts
```

```txt theme={null}
种子数据完成。
```

***

数据库现在有了模式和一些示例数据。用 Drizzle 查询它，将 `index.ts` 的内容替换为以下内容。

```ts index.ts icon="https://mintcdn.com/span-inc/82N53aP7NFbaCVSl/icons/typescript.svg?fit=max&auto=format&n=82N53aP7NFbaCVSl&q=85&s=787d39d6a7d96d7f9540dc74344eba23" theme={null}
import * as schema from "./schema";
import { db } from "./db";

const result = await db.select().from(schema.movies);
console.log(result);
```

***

然后运行该文件。你应该会看到你插入的三部电影。

```sh terminal icon="terminal" theme={null}
bun run index.ts
```

```txt theme={null}
[
  {
    id: 1,
    title: "The Matrix",
    releaseYear: 1999
  }, {
    id: 2,
    title: "The Matrix Reloaded",
    releaseYear: 2003
  }, {
    id: 3,
    title: "The Matrix Revolutions",
    releaseYear: 2003
  }
]
```

***

参见 [Drizzle 文档](https://orm.drizzle.team/docs/overview)。
