Become a Gold Sponsor

使用 Vercel Edge Functions 进行 Drizzle

本教程演示如何在Edge 运行时中使用 Drizzle ORM 与 Vercel Functions

This guide assumes familiarity with:
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
IMPORTANT

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

如果您不是在使用 React Native,可以通过强制安装 --force--legacy-peer-deps 来解决此问题。如果您使用的是 React Native,则需要使用与您的 React Native 版本兼容的 React 的精确版本。

兼容 Edge 的驱动程序

在使用 Vercel Edge 函数与 Drizzle ORM 时,您必须使用兼容 Edge 的驱动程序,因为函数在 Edge 运行时 中运行,而不是在 Node.js 运行时,这样标准 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 配置 - 由 Drizzle Kit 使用的配置文件,包含有关您的数据库连接、迁移文件夹和架构文件的所有信息。

在项目根目录创建 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 文件和用于存储不同迁移阶段/schema 快照的 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
IMPORTANT
Push 命令适合需要快速测试新架构设计或更改的情况,允许在本地开发环境中快速迭代,而无需管理迁移文件的开销。

将 Drizzle ORM 连接到您的数据库

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

src/db/index.ts
import { Pool } from '@neondatabase/serverless';
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'; // 默认为静态,除非读取请求
export const runtime = '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) 以访问您的边缘函数。

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 配置 - 由 Drizzle Kit 使用的配置文件,包含有关您的数据库连接、迁移文件夹和架构文件的所有信息。

在项目根目录创建 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 文件和用于存储不同迁移阶段/schema 快照的 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
IMPORTANT
Push 命令适合需要快速测试新架构设计或更改的情况,允许在本地开发环境中快速迭代,而无需管理迁移文件的开销。

将 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'; // 默认为静态,除非读取请求
export const runtime = '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) 以访问您的边缘函数。

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 配置 - 由 Drizzle Kit 使用的配置文件,包含有关您的数据库连接、迁移文件夹和架构文件的所有信息。

在项目根目录创建 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 文件和用于存储不同迁移阶段/schema 快照的 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
IMPORTANT
Push 命令适合需要快速测试新架构设计或更改的情况,允许在本地开发环境中快速迭代,而无需管理迁移文件的开销。

将 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'; // 默认为静态,除非读取请求
export const runtime = '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) 以访问您的边缘函数。

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 配置 - 由 Drizzle Kit 使用的配置文件,包含有关您的数据库连接、迁移文件夹和架构文件的所有信息。

在项目根目录创建 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 文件和用于存储不同迁移阶段/schema 快照的 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
IMPORTANT
Push 命令适合需要快速测试新架构设计或更改的情况,允许在本地开发环境中快速迭代,而无需管理迁移文件的开销。

将 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'; // 默认为静态,除非读取请求
export const runtime = '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) 以访问您的边缘函数。