使用 Encore 的 Drizzle

本教程演示如何将 Drizzle ORMEncore 一起使用,Encore 是一个开源的后端框架,内建基础设施自动化和可观测性功能。

本指南假定您已熟悉:
  • 你需要安装 Encore CLI。你可以使用以下命令安装:
# macOS
brew install encoredev/tap/encore

# Linux
curl -L https://encore.dev/install.sh | bash

# Windows
iwr https://encore.dev/install.ps1 | iex
  • 你需要安装 Drizzle ORM 以及 Drizzle kit。你可以运行以下命令进行安装:
npm
yarn
pnpm
bun
npm i drizzle-orm
npm i -D drizzle-kit

配置 Encore 和 Drizzle ORM

创建一个新的 Encore 项目

你可以创建一个 Drizzle 已预配置的新 Encore 项目:

encore app create my-app --example=ts/drizzle
cd my-app

或者如果你已有现成的 Encore 项目,安装 Drizzle:

npm
yarn
pnpm
bun
npm i drizzle-orm
npm i -D drizzle-kit

创建数据库

database.ts 文件中定义你的数据库。Encore 会自动在本地使用 Docker 预置 PostgreSQL 数据库,部署到云端时亦然:

database.ts
import { SQLDatabase } from "encore.dev/storage/sqldb";
import { drizzle } from "drizzle-orm/node-postgres";
import * as schema from "./schema";

const db = new SQLDatabase("mydb", {
  migrations: {
    path: "migrations",
    source: "drizzle",
  },
});

export const orm = drizzle(db.connectionString, { schema });

source: "drizzle" 设定为告诉 Encore 使用 Drizzle 的迁移格式。

定义你的 Schema

创建 schema.ts 文件来定义表:

schema.ts
import * as p from "drizzle-orm/pg-core";

export const users = p.pgTable("users", {
  id: p.serial().primaryKey(),
  name: p.text().notNull(),
  email: p.text().unique().notNull(),
  createdAt: p.timestamp().defaultNow().notNull(),
});

配置 Drizzle 配置文件

创建 drizzle.config.ts 文件:

drizzle.config.ts
import { defineConfig } from "drizzle-kit";

export default defineConfig({
  out: "migrations",
  schema: "schema.ts",
  dialect: "postgresql",
});

生成迁移文件

运行 Drizzle Kit 从你的 Schema 生成迁移:

drizzle-kit generate

这会在 migrations 文件夹中生成迁移文件。

创建 API 端点

在你的 Encore 端点中使用 Drizzle:

users.ts
import { api } from "encore.dev/api";
import { orm } from "./database";
import { users } from "./schema";
import { eq } from "drizzle-orm";

interface User {
  id: number;
  name: string;
  email: string;
}

export const list = api(
  { expose: true, method: "GET", path: "/users" },
  async (): Promise<{ users: User[] }> => {
    const result = await orm.select().from(users);
    return { users: result };
  }
);

export const create = api(
  { expose: true, method: "POST", path: "/users" },
  async (req: { name: string; email: string }): Promise<User> => {
    const [user] = await orm
      .insert(users)
      .values({ name: req.name, email: req.email })
      .returning();
    return user;
  }
);

运行你的应用

启动你的 Encore 应用:

encore run

Encore 在启动时自动应用迁移。打开 localhost:9400 可查看本地仪表盘,包含 API 文档、数据库浏览器及追踪功能。

当你运行 Encore 应用时,迁移会自动应用。你不需要手动执行 drizzle-kit migrate

了解更多