Drizzle 与 Vercel Edge Functions

本教程演示了如何在 Edge runtime 中将 Drizzle ORM 与 Vercel Functions 结合使用。

本指南假定您熟悉
npm
yarn
pnpm
bun
npm i -g vercel
  • 您应该有一个现有的 Next.js 项目,或者使用以下命令创建一个新项目
npx create-next-app@latest --typescript
  • 您应该已经安装了 Drizzle ORM 和 Drizzle Kit。您可以通过运行以下命令来完成此操作:
npm
yarn
pnpm
bun
npm i drizzle-orm
npm i -D drizzle-kit
重要提示

如果在安装过程中遇到依赖解析问题

如果您没有使用 React Native,使用 --force--legacy-peer-deps 强制安装应该可以解决问题。如果您正在使用 React Native,则需要使用与您的 React Native 版本兼容的精确 React 版本。

Edge 兼容驱动程序

将 Drizzle ORM 与 Vercel Edge 函数结合使用时,您必须使用 Edge 兼容驱动程序,因为这些函数在 Edge runtime 而不是 Node.js runtime 中运行,因此标准 Node.js API 会有一些限制。

您可以根据您的数据库方言选择其中一个驱动程序

Neon Postgres

安装 @neondatabase/serverless 驱动程序

安装 @neondatabase/serverless 驱动程序

npm
yarn
pnpm
bun
npm i @neondatabase/serverless

创建表

src/db 目录中创建 schema.ts 文件并声明表架构

src/db/schema.ts
import { pgTable, serial, text } from "drizzle-orm/pg-core";

export const usersTable = pgTable('users_table', {
  id: serial('id').primaryKey(),
  name: text('name').notNull(),
  age: text('age').notNull(),
  email: text('email').notNull().unique(),
})

设置 Drizzle 配置文件

Drizzle config - 由 Drizzle Kit 使用的配置文件,包含有关你的数据库连接、迁移文件夹和 schema 文件的所有信息。

在项目的根目录中创建 drizzle.config.ts 文件并添加以下内容

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

export default defineConfig({
  schema: "./src/db/schema.ts",
  dialect: "postgresql",
  dbCredentials: {
    url: process.env.POSTGRES_URL!,
  },
});

.env 文件中配置您的数据库连接字符串

.env
POSTGRES_URL="postgres://[user]:[password]@[host]-[region].aws.neon.tech:5432/[db-name]?sslmode=[ssl-mode]"

应用更改到数据库

您可以使用 drizzle-kit generate 命令生成迁移,然后使用 drizzle-kit migrate 命令运行它们。

生成迁移

npx drizzle-kit generate

这些迁移存储在 drizzle 目录中,如您的 drizzle.config.ts 中所指定。此目录将包含更新数据库架构所需的 SQL 文件,以及一个用于存储不同迁移阶段架构快照的 meta 文件夹。

生成迁移示例

CREATE TABLE IF NOT EXISTS "users_table" (
	"id" serial PRIMARY KEY NOT NULL,
	"name" text NOT NULL,
	"age" text NOT NULL,
	"email" text NOT NULL,
	CONSTRAINT "users_table_email_unique" UNIQUE("email")
);

运行迁移

npx drizzle-kit migrate

或者,您可以使用 Drizzle kit push 命令 将更改直接推送到数据库

npx drizzle-kit push
重要提示
Push 命令适用于您需要在本地开发环境中快速测试新 schema 设计或更改的情况,它允许快速迭代而无需管理迁移文件的开销。

将 Drizzle ORM 连接到您的数据库

src/db 目录中创建 index.ts 文件并设置数据库配置

src/db/index.ts
import { drizzle } from 'drizzle-orm/neon-serverless';


export const db = drizzle(process.env.POSTGRES_URL!)

创建 API 路由

src/app/api/hello 目录中创建 route.ts 文件。要了解更多关于如何编写函数的信息,请参阅 Functions API ReferenceVercel Functions Quickstart

src/app/api/hello/route.ts
import { db } from "@/db";
import { usersTable } from "@/db/schema";
import { NextResponse } from "next/server";

export const dynamic = 'force-dynamic'; // static by default, unless reading the request
export const runtime = 'edge' // specify the runtime to be edge

export async function GET(request: Request) {
  const users = await db.select().from(usersTable)

  return NextResponse.json({ users, message: 'success' });
}

在本地测试您的代码

运行 next dev 命令启动您的本地开发服务器

npx next dev

在浏览器中导航到您创建的路由(例如 /api/hello

{
  "users": [],
  "message": "success"
}

部署您的项目

控制台创建新项目或运行 vercel 命令部署您的项目

vercel

添加 POSTGRES_URL 环境变量

vercel env add POSTGRES_URL

重新部署您的项目以更新环境变量

vercel

最后,您可以使用已部署项目的 URL 并导航到您创建的路由(例如 /api/hello)来访问您的 Edge 函数。

Vercel Postgres

您可以在文档中查看 Drizzle 与 Vercel Postgres 客户端的快速入门指南。

安装 @vercel/postgres 驱动程序

安装 @vercel/postgres 驱动程序

npm
yarn
pnpm
bun
npm i @vercel/postgres

创建表

src/db 目录中创建 schema.ts 文件并声明表架构

src/db/schema.ts
import { pgTable, serial, text } from "drizzle-orm/pg-core";

export const usersTable = pgTable('users_table', {
  id: serial('id').primaryKey(),
  name: text('name').notNull(),
  age: text('age').notNull(),
  email: text('email').notNull().unique(),
})

设置 Drizzle 配置文件

Drizzle config - 由 Drizzle Kit 使用的配置文件,包含有关你的数据库连接、迁移文件夹和 schema 文件的所有信息。

在项目的根目录中创建 drizzle.config.ts 文件并添加以下内容

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

export default defineConfig({
  schema: "./src/db/schema.ts",
  dialect: "postgresql",
  dbCredentials: {
    url: process.env.POSTGRES_URL!,
  },
});

.env 文件中配置您的数据库连接字符串

.env
POSTGRES_URL="postgres://[user]:[password]@[host]-[region].aws.neon.tech:5432/[db-name]?sslmode=[ssl-mode]"

将更改应用于数据库

您可以使用 drizzle-kit generate 命令生成迁移,然后使用 drizzle-kit migrate 命令运行它们。

生成迁移

npx drizzle-kit generate

这些迁移存储在 drizzle 目录中,如您的 drizzle.config.ts 中所指定。此目录将包含更新数据库架构所需的 SQL 文件,以及一个用于存储不同迁移阶段架构快照的 meta 文件夹。

生成迁移示例

CREATE TABLE IF NOT EXISTS "users_table" (
	"id" serial PRIMARY KEY NOT NULL,
	"name" text NOT NULL,
	"age" text NOT NULL,
	"email" text NOT NULL,
	CONSTRAINT "users_table_email_unique" UNIQUE("email")
);

运行迁移

npx drizzle-kit migrate

或者,您可以使用 Drizzle kit push 命令 将更改直接推送到数据库

npx drizzle-kit push
重要提示
Push 命令适用于您需要在本地开发环境中快速测试新 schema 设计或更改的情况,它允许快速迭代而无需管理迁移文件的开销。

将 Drizzle ORM 连接到您的数据库

src/db 目录中创建 index.ts 文件并设置数据库配置

src/db/index.ts
import { drizzle } from 'drizzle-orm/vercel-postgres';

export const db = drizzle()

创建 API 路由

src/app/api/hello 目录中创建 route.ts 文件。要了解更多关于如何编写函数的信息,请参阅 Functions API ReferenceVercel Functions Quickstart

src/app/api/hello/route.ts

import { db } from "@/db";
import { usersTable } from "@/db/schema";
import { NextResponse } from "next/server";

export const dynamic = 'force-dynamic'; // static by default, unless reading the request
export const runtime = 'edge' // specify the runtime to be edge

export async function GET(request: Request) {
  const users = await db.select().from(usersTable)

  return NextResponse.json({ users, message: 'success' });
}

在本地测试您的代码

运行 next dev 命令启动您的本地开发服务器

npx next dev

在浏览器中导航到您创建的路由(例如 /api/hello

{
  "users": [],
  "message": "success"
}

部署您的项目

控制台创建新项目或运行 vercel 命令部署您的项目

vercel

添加 POSTGRES_URL 环境变量

vercel env add POSTGRES_URL

重新部署您的项目以更新环境变量

vercel

最后,您可以使用已部署项目的 URL 并导航到您创建的路由(例如 /api/hello)来访问您的 Edge 函数。

PlanetScale

在本教程中,我们使用 PlanetScale MySQL

安装 @planetscale/database 驱动程序

安装 @planetscale/database 驱动程序

npm
yarn
pnpm
bun
npm i @planetscale/database

创建表

src/db 目录中创建 schema.ts 文件并声明表架构

src/db/schema.ts
import { mysqlTable, serial, text } from "drizzle-orm/mysql-core";

export const usersTable = mysqlTable('users_table', {
  id: serial('id').primaryKey(),
  name: text('name').notNull(),
  age: text('age').notNull(),
  email: text('email').notNull().unique(),
})

设置 Drizzle 配置文件

Drizzle config - 由 Drizzle Kit 使用的配置文件,包含有关你的数据库连接、迁移文件夹和 schema 文件的所有信息。

在项目的根目录中创建 drizzle.config.ts 文件并添加以下内容

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

export default defineConfig({
  schema: "./src/db/schema.ts",
  dialect: "mysql",
  dbCredentials: {
    url: process.env.MYSQL_URL!,
  },
});

.env 文件中配置您的数据库连接字符串

.env
MYSQL_URL="mysql://[user]:[password]@[host].[region].psdb.cloud/[db-name]?ssl={'rejectUnauthorized':[ssl-rejectUnauthorized]}"

将更改应用于数据库

您可以使用 drizzle-kit generate 命令生成迁移,然后使用 drizzle-kit migrate 命令运行它们。

生成迁移

npx drizzle-kit generate

这些迁移存储在 drizzle 目录中,如您的 drizzle.config.ts 中所指定。此目录将包含更新数据库架构所需的 SQL 文件,以及一个用于存储不同迁移阶段架构快照的 meta 文件夹。

生成迁移示例

CREATE TABLE `users_table` (
	`id` serial AUTO_INCREMENT NOT NULL,
	`name` text NOT NULL,
	`age` text NOT NULL,
	`email` text NOT NULL,
	CONSTRAINT `users_table_id` PRIMARY KEY(`id`),
	CONSTRAINT `users_table_email_unique` UNIQUE(`email`)
);

运行迁移

npx drizzle-kit migrate

或者,您可以使用 Drizzle kit push 命令 将更改直接推送到数据库

npx drizzle-kit push
重要提示
Push 命令适用于您需要在本地开发环境中快速测试新 schema 设计或更改的情况,它允许快速迭代而无需管理迁移文件的开销。

将 Drizzle ORM 连接到您的数据库

src/db 目录中创建 index.ts 文件并设置数据库配置

src/db/index.ts
import { drizzle } from "drizzle-orm/planetscale-serverless";

export const db = drizzle(process.env.MYSQL_URL!)

创建 API 路由

src/app/api/hello 目录中创建 route.ts 文件。要了解更多关于如何编写函数的信息,请参阅 Functions API ReferenceVercel Functions Quickstart

src/app/api/hello/route.ts
import { db } from "@/app/db/db";
import { usersTable } from "@/app/db/schema";
import { NextResponse } from "next/server";

export const dynamic = 'force-dynamic'; // static by default, unless reading the request
export const runtime = 'edge' // specify the runtime to be edge

export async function GET(request: Request) {
  const users = await db.select().from(usersTable)

  return NextResponse.json({ users, message: 'success' });
}

在本地测试您的代码

运行 next dev 命令启动您的本地开发服务器

npx next dev

在浏览器中导航到您创建的路由(例如 /api/hello

{
  "users": [],
  "message": "success"
}

部署您的项目

控制台创建新项目或运行 vercel 命令部署您的项目

vercel

添加 MYSQL_URL 环境变量

vercel env add MYSQL_URL

重新部署您的项目以更新环境变量

vercel

最后,您可以使用已部署项目的 URL 并导航到您创建的路由(例如 /api/hello)来访问您的 Edge 函数。

Turso

您可以在文档中查看 Drizzle 与 Turso 的快速入门指南教程

安装 @libsql/client 驱动程序

安装 @libsql/client 驱动程序

npm
yarn
pnpm
bun
npm i @libsql/client

创建表

src/db 目录中创建 schema.ts 文件并声明表架构

src/db/schema.ts
import { integer, sqliteTable, text } from "drizzle-orm/sqlite-core";

export const usersTable = sqliteTable('users_table', {
  id: integer('id').primaryKey(),
  name: text('name').notNull(),
  age: text('age').notNull(),
  email: text('email').notNull().unique(),
})

设置 Drizzle 配置文件

Drizzle config - 由 Drizzle Kit 使用的配置文件,包含有关你的数据库连接、迁移文件夹和 schema 文件的所有信息。

在项目的根目录中创建 drizzle.config.ts 文件并添加以下内容

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

export default defineConfig({
  schema: "./src/db/schema.ts",
  dialect: "turso",
  dbCredentials: {
    url: process.env.TURSO_CONNECTION_URL!,
    authToken: process.env.TURSO_AUTH_TOKEN!,
  },
});

.env 文件中配置您的数据库连接字符串和认证令牌

.env
TURSO_CONNECTION_URL="libsql://[db-name].turso.io"
TURSO_AUTH_TOKEN="[auth-token]"

将更改应用于数据库

您可以使用 drizzle-kit generate 命令生成迁移,然后使用 drizzle-kit migrate 命令运行它们。

生成迁移

npx drizzle-kit generate

这些迁移存储在 drizzle 目录中,如您的 drizzle.config.ts 中所指定。此目录将包含更新数据库架构所需的 SQL 文件,以及一个用于存储不同迁移阶段架构快照的 meta 文件夹。

生成迁移示例

CREATE TABLE `users_table` (
	`id` integer PRIMARY KEY NOT NULL,
	`name` text NOT NULL,
	`age` text NOT NULL,
	`email` text NOT NULL
);
--> statement-breakpoint
CREATE UNIQUE INDEX `users_table_email_unique` ON `users_table` (`email`);

运行迁移

npx drizzle-kit migrate

或者,您可以使用 Drizzle kit push 命令 将更改直接推送到数据库

npx drizzle-kit push
重要提示
Push 命令适用于您需要在本地开发环境中快速测试新 schema 设计或更改的情况,它允许快速迭代而无需管理迁移文件的开销。

将 Drizzle ORM 连接到您的数据库

src/db 目录中创建 index.ts 文件并设置数据库配置

src/db/index.ts
import { drizzle } from 'drizzle-orm/libsql';

export const db = drizzle({ connection: {
  url: process.env.TURSO_CONNECTION_URL!,
  authToken: process.env.TURSO_AUTH_TOKEN!,
}})

创建 API 路由

src/app/api/hello 目录中创建 route.ts 文件。要了解更多关于如何编写函数的信息,请参阅 Functions API ReferenceVercel Functions Quickstart

src/app/api/hello/route.ts
import { db } from "@/app/db/db";
import { usersTable } from "@/app/db/schema";
import { NextResponse } from "next/server";

export const dynamic = 'force-dynamic'; // static by default, unless reading the request
export const runtime = 'edge' // specify the runtime to be edge

export async function GET(request: Request) {
  const users = await db.select().from(usersTable)

  return NextResponse.json({ users, message: 'success' });
}

在本地测试您的代码

运行 next dev 命令启动您的本地开发服务器

npx next dev

在浏览器中导航到您创建的路由(例如 /api/hello

{
  "users": [],
  "message": "success"
}

部署您的项目

控制台创建新项目或运行 vercel 命令部署您的项目

vercel

添加 TURSO_CONNECTION_URL 环境变量

vercel env add TURSO_CONNECTION_URL

添加 TURSO_AUTH_TOKEN 环境变量

vercel env add TURSO_AUTH_TOKEN

重新部署您的项目以更新环境变量

vercel

最后,您可以使用已部署项目的 URL 并导航到您创建的路由(例如 /api/hello)来访问您的 Edge 函数。