当你运行 Encore 应用时,迁移会自动应用。你不需要手动执行 drizzle-kit migrate。
使用 Encore 的 Drizzle
本教程演示如何将 Drizzle ORM 与 Encore 一起使用,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 数据库,部署到云端时亦然:
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 文件来定义表:
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 文件:
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:
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 runEncore 在启动时自动应用迁移。打开 localhost:9400 可查看本地仪表盘,包含 API 文档、数据库浏览器及追踪功能。