使用 Supabase Edge Functions 的 Drizzle
本教程演示了如何使用 Drizzle ORM 与 Supabase Edge Functions。
- 你应该安装最新版本的 Supabase CLI。
- 你应该已经安装了 Drizzle ORM 和 Drizzle kit。你可以通过运行以下命令来完成:
npm i drizzle-orm
npm i -D drizzle-kit
- 你应该安装 Docker Desktop。它是本地开发的前提条件。请按照官方 文档 进行安装。
要了解如何在本地计算机上创建基本的 Edge Function 并进行部署,请参阅 Edge Functions 快速入门。
创建表
在 src
目录中创建一个 schema.ts
文件,并声明一个表架构:
import { pgTable, serial, text, integer } from "drizzle-orm/pg-core";
export const usersTable = pgTable('users_table', {
id: serial('id').primaryKey(),
name: text('name').notNull(),
age: integer('age').notNull()
})
此文件将用于为你的数据库生成迁移。
设置 Drizzle 配置文件
Drizzle 配置 - 是一个由 Drizzle Kit 使用的配置文件,其中包含关于数据库连接、迁移文件夹和架构文件的所有信息。
在项目根目录中创建一个 drizzle.config.ts
文件,并添加以下内容:
import { defineConfig } from "drizzle-kit";
export default defineConfig({
schema: "./src/schema.ts",
out: "./supabase/migrations",
dialect: "postgresql",
});
在本教程中,我们将使用 Drizzle kit 为我们的架构生成迁移。
初始化新的 Supabase 项目
在本地计算机的文件夹中创建一个新的 Supabase 项目:
supabase init
这将创建一个 supabase
文件夹和 config.toml
文件:
└── supabase
└── config.toml
如果你在使用 Visual Studio Code,请按照 Supabase 文档 设置 Deno 的配置。
生成迁移
运行 drizzle-kit generate
命令生成迁移:
npx drizzle-kit generate
这将在 supabase/migrations
目录中创建一个新的迁移文件:
应用迁移
要启动 Supabase 本地开发栈,请运行以下命令:
supabase start
要应用迁移,请运行以下命令:
supabase migration up
你可以在 文档 中阅读更多关于 Supabase 迁移的信息。
另外,你也可以使用 drizzle-kit migrate
命令来应用迁移。了解更多关于此迁移过程的信息,请查看 文档。
创建新的 Edge Function
运行 supabase functions new [FUNCTION_NAME]
命令创建新的 Edge Function:
supabase functions new drizzle-tutorial
这将在 supabase/functions
目录下创建一个新的函数名称文件夹:
└── supabase
└── functions
│ └── drizzle-tutorial
│ │ ├── .npmrc ## 函数特定的 npm 配置(如果需要)
│ │ ├── deno.json ## 函数特定的 Deno 配置
│ │ └── index.ts ## 你的函数代码
创建新的 Edge Function 时,默认情况下将使用 TypeScript。但是,也可以使用 JavaScript 编写 Edge Function。了解更多信息请参阅 文档。
设置导入
将以下导入添加到 supabase/functions/drizzle-tutorial/deno.json
文件中:
{
"imports": {
"drizzle-orm/": "npm:/drizzle-orm/",
"postgres": "npm:postgres"
}
}
你可以在 这里 阅读更多关于管理依赖的信息。
将你的架构复制到函数目录
从 src/schema.ts
文件中复制你将在 Edge Function 中使用的代码到 supabase/functions/drizzle-tutorial/index.ts
文件:
// 设置内置 Supabase Runtime API 的类型定义
import "jsr:@supabase/functions-js/edge-runtime.d.ts"
import { pgTable, serial, text, integer } from "drizzle-orm/pg-core";
const usersTable = pgTable('users_table', {
id: serial('id').primaryKey(),
name: text('name').notNull(),
age: integer('age').notNull()
})
Deno.serve(async (req) => {
const { name } = await req.json()
const data = {
message: `Hello ${name}!`,
}
return new Response(
JSON.stringify(data),
{ headers: { "Content-Type": "application/json" } },
)
})
在 Deno 生态系统中,每个函数都应该被视为一个独立的项目,并具有自己的一组依赖和配置。
因此,Supabase 建议在每个函数的目录中维护单独的配置文件(deno.json
、.npmrc
或 import_map.json
),即使这意味着重复一些配置。更多信息请查阅 这里。
将 Drizzle ORM 连接到你的数据库
更新你的 Edge Function 代码以包含数据库配置:
// 设置内置 Supabase Runtime API 的类型定义
import { integer, pgTable, serial, text } from "drizzle-orm/pg-core";
import { drizzle } from "drizzle-orm/postgres-js";
import "jsr:@supabase/functions-js/edge-runtime.d.ts";
import postgres from "postgres";
const usersTable = pgTable('users_table', {
id: serial('id').primaryKey(),
name: text('name').notNull(),
age: integer('age').notNull()
})
Deno.serve(async () => {
const connectionString = Deno.env.get("SUPABASE_DB_URL")!;
// 禁用预取,因为它不支持“Transaction”池模式
const client = postgres(connectionString, { prepare: false });
const db = drizzle({ client });
await db.insert(usersTable).values({
name: "Alice",
age: 25
})
const data = await db.select().from(usersTable);
return new Response(
JSON.stringify(data)
)
})
SUPABASE_DB_URL
是直接数据库连接的默认环境变量。了解更多关于管理 Supabase Edge Function 中环境变量的信息,请查阅 文档。
在本地测试你的代码
运行以下命令在本地测试你的函数:
supabase functions serve --no-verify-jwt
在浏览器中导航到创建的路由 (e.g. /drizzle-tutorial)
:
[
{
"id": 1,
"name": "Alice",
"age": 25
}
]
将本地项目链接到托管的 Supabase 项目
你可以在 仪表板 中创建新的 Supabase 项目或通过此 链接。
从项目设置中复制 Reference ID
,并使用它通过运行以下命令将你的本地开发项目链接到托管的 Supabase 项目:
supabase link --project-ref=<REFERENCE_ID>
通过运行以下命令将模式更改推送到托管的 Supabase 项目:
supabase db push
设置环境变量
你可以通过点击仪表板顶部栏中的 Connect 找到 Project connect details
,并从 Transaction pooler
部分复制 URI。记得将密码占位符替换为你的实际数据库密码。
了解更多关于连接池的信息,请查阅 文档。
更新你的 Edge Function 代码,以使用 DATABASE_URL
环境变量而不是 SUPABASE_DB_URL
:
// imports
// const connectionString = Deno.env.get("SUPABASE_DB_URL")!;
const connectionString = Deno.env.get("DATABASE_URL")!;
// code
运行以下命令来设置环境变量:
supabase secrets set DATABASE_URL=<CONNECTION_STRING>
了解更多关于管理 Supabase Edge Functions 中的环境变量的信息,请查看 文档。
部署你的函数
通过运行以下命令部署你的函数:
supabase functions deploy drizzle-tutorial --no-verify-jwt
最后,你可以使用部署项目的 URL,导航到你创建的路由 (e.g. /drizzle-tutorial)
来访问你的 Edge Function。