在 Supabase 中使用 Drizzle ORM

本教程演示了如何在 Supabase Edge Functions 中使用 Drizzle ORM。

This guide assumes familiarity with:
  • 您应该安装了最新版本的 Supabase CLI
  • 您应该已安装 Drizzle ORM 和 Drizzle kit。您可以通过运行以下命令完成此操作:
npm
yarn
pnpm
bun
npm i drizzle-orm
npm i -D drizzle-kit
  • 您应该已安装了 Docker Desktop。这是本地开发的先决条件。请按照官方文档进行安装。

要了解如何在本地计算机上创建基本的 Edge Function,然后部署它,请参阅 Edge Functions 快速入门

初始化新的 Supabase 项目

在本地计算机上的一个文件夹中创建一个新的 Supabase 项目:

supabase init

它将创建一个带有 config.toml 文件的 supabase 文件夹:

└── supabase
    └── config.toml

如果您使用的是 Visual Studio Code,请按照 Supabase 文档设置 Deno 的设置。

创建新的 Edge Function

运行 supabase functions new [FUNCTION_NAME] 命令以创建新的 Edge Function:

supabase functions new drizzle-tutorial

它将在 supabase/functions 目录中创建一个名为该函数名的新文件夹:

└── supabase
    └── functions
    │   └── drizzle-tutorial
    │   │   └── index.ts ## 您的函数代码

设置导入

supabase/functions 目录中创建一个 import_map.json 文件,并为 Drizzle ORM 添加导入:

supabase/functions/import_map.json
{
  "imports": {
    "drizzle-orm": "npm:drizzle-orm@0.30.10",
    "drizzle-orm/": "npm:/drizzle-orm@0.30.10/"
  }
}

了解更多内容,请查看文档

创建表

supabase/functions/common 目录中创建一个 schema.ts 文件,并声明表模式:

supabase/functions/common/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(),
  email: text('email').notNull().unique(),
})

设置 Drizzle 配置文件

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

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

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

export default defineConfig({
  schema: "./supabase/functions/common/schema.ts",
  out: "./supabase/migrations",
  dialect: "postgresql",
});

在本教程中,我们将使用 Drizzle kit 为我们的模式生成迁移。

生成迁移

运行 drizzle-kit generate 命令生成迁移:

npx drizzle-kit generate

它将在 supabase/migrations 目录中创建一个新的迁移文件:

应用迁移

要应用迁移并启动 Supabase 本地开发堆栈,请运行以下命令:

supabase start

或者,您可以使用 migrate() 助手应用迁移,该助手适用于每个受支持的驱动程序。在文档中了解更多关于此迁移过程的信息。

连接 Drizzle ORM 到您的数据库

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

supabase/functions/common/db.ts
import postgres from "npm:postgres";
import { drizzle } from "drizzle-orm/postgres-js";

const connectionString = Deno.env.get("SUPABASE_DB_URL")!;

// Disable prefetch as it is not supported for "Transaction" pool mode
const client = postgres(connectionString, { prepare: false });
export const db = drizzle(client);

SUPABASE_DB_URL 是直接数据库连接的默认环境变量。在 Supabase Edge Functions 的文档中了解更多关于管理环境变量的内容。

在本地测试代码

supabase/functions/drizzle-tutorial/index.ts
import { db } from "../common/db.ts";
import { usersTable } from "../common/schema.ts";

Deno.serve(async (req) => {
  await db.insert(usersTable).values({
    name: "Alice",
    email: "email",
    age: 25
  })
  const data = await db.select().from(usersTable);

  return new Response(
    JSON.stringify(data),
    { headers: { "Content-Type": "application/json" } },
  );
});

运行以下命令在本地测试您的函数:

supabase functions serve --no-verify-jwt

在浏览器中导航到路由(例如 /drizzle-tutorial):

[
  {
    "id": 1,
    "name": "Alice",
    "age": 25,
    "email": "email"
  }
]

将本地项目链接到托管的 Supabase 项目

您可以在仪表板中创建新的 Supabase 项目,或通过以下链接创建新的 Supabase 项目:链接

复制引用 ID,并使用以下命令将本地开发项目链接到托管的 Supabase 项目:

supabase link --project-ref <REFERENCE_ID>

通过以下命令将模式更改推送到托管 Supabase 项目:

supabase db push

设置环境变量

进入数据库设置,从连接字符串部分复制 URI。确保使用连接池事务模式连接到您的数据库。记得用您实际的数据库密码替换密码占位符。

运行以下命令设置环境变量:

supabase secrets set DATABASE_URL=<CONNECTION_STRING>

更新 supabase/functions/common/db.ts 目录中的 db.ts 文件以使用 DATABASE_URL 环境变量:

supabase/functions/common/db.ts
// 导入

const connectionString = Deno.env.get("DATABASE_URL")!;

// 代码

在 Supabase Edge Functions 的文档中了解更多关于管理环境变量的内容。

部署您的函数

通过以下命令部署您的函数:

supabase functions deploy drizzle-tutorial --no-verify-jwt

最后,您可以使用部署项目的URL,并导航到您创建的路由(例如 /drizzle-tutorial)来访问您的边缘函数。

Become a Gold Sponsor