Drizzle 与 Vercel 边缘函数的结合

本教程演示了如何在 Edge 运行时 中使用 Drizzle ORM 和 Vercel 函数

This guide assumes familiarity with:
  • 你应该已经安装了最新版本的 Vercel CLI
npm
yarn
pnpm
bun
npm i -g vercel
  • 你应该拥有一个现有的 Next.js 项目,或者使用以下命令创建一个新项目:
npx create-next-app@latest --typescript
  • 你应该已经安装了 Drizzle ORM 和 Drizzle 套件。你可以通过运行以下命令来实现:
npm
yarn
pnpm
bun
npm i drizzle-orm -D drizzle-kit
IMPORTANT

如果你在安装过程中遇到解决依赖的问题:

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

Edge 兼容驱动程序

将 Drizzle ORM 与 Vercel Edge 函数一起使用时,你必须使用 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 套件 使用的配置文件,包含有关数据库连接、迁移文件夹和模式文件的所有信息。

在项目根目录中创建一个 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 套件推送命令 将更改直接推送到数据库:

npx drizzle-kit push
IMPORTANT
Push command is good for situations where you need to quickly test new schema designs or changes in a local development environment, allowing for fast iterations without the overhead of managing migration files.

将 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 参考Vercel 函数快速入门

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

你可以在 documentation 中查看 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 套件 使用的配置文件,包含有关数据库连接、迁移文件夹和模式文件的所有信息。

在项目根目录中创建一个 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 套件推送命令 将更改直接推送到数据库:

npx drizzle-kit push
IMPORTANT
Push command is good for situations where you need to quickly test new schema designs or changes in a local development environment, allowing for fast iterations without the overhead of managing migration files.

将 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 参考Vercel 函数快速入门

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 套件 使用的配置文件,包含有关数据库连接、迁移文件夹和模式文件的所有信息。

在项目根目录中创建一个 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 套件推送命令 将更改直接推送到数据库:

npx drizzle-kit push
IMPORTANT
Push command is good for situations where you need to quickly test new schema designs or changes in a local development environment, allowing for fast iterations without the overhead of managing migration files.

将 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 参考Vercel 函数快速入门

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 with Turso 的 快速入门指南tutorial

安装 @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 套件 使用的配置文件,包含有关数据库连接、迁移文件夹和模式文件的所有信息。

在项目根目录中创建一个 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 套件推送命令 将更改直接推送到数据库:

npx drizzle-kit push
IMPORTANT
Push command is good for situations where you need to quickly test new schema designs or changes in a local development environment, allowing for fast iterations without the overhead of managing migration files.

将 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 参考Vercel 函数快速入门

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) 来访问你的边缘函数。