Bun

指南生態系統

將 Drizzle ORM 與 Bun 一起使用

Drizzle 是一個 ORM,它同時支援類似 SQL 的“查詢構建器”API 和類似 ORM 的 查詢 API。它支援內建的 bun:sqlite 模組。

讓我們透過使用 bun init 建立一個新專案並安裝 Drizzle 來開始。

bun init -y
bun add drizzle-orm
bun add -D drizzle-kit

然後,我們將使用 bun:sqlite 模組連線到 SQLite 資料庫並建立 Drizzle 資料庫例項。

db.ts
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

index.ts
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 並執行查詢。

bun run index.ts
{
  text: "hello world"
}

讓我們為資料庫設定一個正確的 Schema。建立一個 schema.ts 檔案並定義一個 movies 表。

schema.ts
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 遷移。

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 資料庫的新連線,該連線寫入 sqlite.db,然後執行 drizzle 目錄中所有未執行的遷移。

migrate.ts
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 執行此指令碼來執行遷移。

bun run migrate.ts

現在我們有了資料庫,讓我們新增一些資料。建立一個 seed.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.`);

然後執行此檔案。

bun run seed.ts
Seeding complete.

我們終於有了一個包含 Schema 和一些示例資料的資料庫。讓我們使用 Drizzle 來查詢它。用以下內容替換 index.ts 的內容。

index.ts
import * as schema from "./schema";
import { db } from "./db";

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

然後執行檔案。您應該會看到我們插入的三部電影。

bun run index.ts
bun run index.ts
[
  {
    id: 1,
    title: "The Matrix",
    releaseYear: 1999
  }, {
    id: 2,
    title: "The Matrix Reloaded",
    releaseYear: 2003
  }, {
    id: 3,
    title: "The Matrix Revolutions",
    releaseYear: 2003
  }
]

有關完整文件,請參閱 Drizzle 網站