在 Vercel 边缘函数中使用 Drizzle ORM

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

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
💡

如果你在安装时遇到依赖解析问题:

如果不是在使用 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 serverless driver 允许你从 serverless 和 edge 环境中通过 HTTP 或 WebSockets 查询你的 Neon Postgres 数据库,而不是通过 TCP。我们建议使用这个驱动程序来连接到 Neon Postgres
  • Vercel Postgres driver 构建在 Neon serverless driver 之上。我们建议使用这个驱动程序来连接到 Vercel Postgres
  • PlanetScale serverless driver 允许你访问任何 MySQL 客户端并通过 HTTP 连接执行查询,这在云提供商中通常不会被阻塞。
  • libSQL client 允许你访问 Turso 数据库。

导航

Neon Postgres

安装 @neondatabase/serverless 驱动

安装 @neondatabase/serverless 驱动:

npm
yarn
pnpm
bun
npm i @neondatabase/serverless

创建表

创建 schema.ts 文件在 src/db 目录下,并声明一个表架构:

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 文件,以及一个 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 命令适合于在本地开发环境中快速测试新的模式设计或更改,允许快速迭代,无需管理迁移文件的开销。

将 Drizzle ORM 连接到你的数据库

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

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

const pool = new Pool({ connectionString: process.env.POSTGRES_URL! });

export const db = drizzle(pool)

创建 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

在你的浏览器中导航到你创建的路线 (e.g. /api/hello)

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

部署你的项目

dashboard 中创建一个新的项目,或者运行 vercel 命令来部署你的项目:

vercel

添加 POSTGRES_URL 环境变量:

vercel env add POSTGRES_URL

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

vercel

最后,你可以使用部署项目的 URL,并导航到你创建的路线 (e.g. /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 文件,以及一个 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 命令适合于在本地开发环境中快速测试新的模式设计或更改,允许快速迭代,无需管理迁移文件的开销。

将 Drizzle ORM 连接到你的数据库

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

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

export const db = drizzle(sql)

创建 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

在你的浏览器中导航到你创建的路线 (e.g. /api/hello)

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

部署你的项目

dashboard 中创建一个新的项目,或者运行 vercel 命令来部署你的项目:

vercel

添加 POSTGRES_URL 环境变量:

vercel env add POSTGRES_URL

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

vercel

最后,你可以使用部署项目的 URL,并导航到你创建的路线 (e.g. /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 文件,以及一个 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 命令适合于在本地开发环境中快速测试新的模式设计或更改,允许快速迭代,无需管理迁移文件的开销。

将 Drizzle ORM 连接到你的数据库

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

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

const client = new Client({
  url: process.env.MYSQL_URL!,
})

export const db = drizzle(client)

创建 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

在你的浏览器中导航到你创建的路线 (e.g. /api/hello)

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

部署你的项目

dashboard 中创建一个新的项目,或者运行 vercel 命令来部署你的项目:

vercel

添加 MYSQL_URL 环境变量:

vercel env add MYSQL_URL

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

vercel

最后,你可以使用部署项目的 URL,并导航到你创建的路线 (e.g. /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: "sqlite",
  driver: "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 命令适合于在本地开发环境中快速测试新的模式设计或更改,允许快速迭代,无需管理迁移文件的开销。

将 Drizzle ORM 连接到你的数据库

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

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

const client = createClient({
  url: process.env.TURSO_CONNECTION_URL!,
  authToken: process.env.TURSO_AUTH_TOKEN!,
});

export const db = drizzle(client)

创建 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

在你的浏览器中导航到你创建的路线 (e.g. /api/hello)

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

部署你的项目

dashboard 中创建一个新的项目,或者运行 vercel 命令来部署你的项目:

vercel

添加 TURSO_CONNECTION_URL 环境变量:

vercel env add TURSO_CONNECTION_URL

添加 TURSO_AUTH_TOKEN 环境变量:

vercel env add TURSO_AUTH_TOKEN

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

vercel

最后,你可以使用部署项目的 URL,并导航到你创建的路线 (e.g. /api/hello) 来访问你的边缘函数。

Become a Gold Sponsor