在 Supabase 上设置一个免费的 PostgreSQL 数据库,以便与 Prisma 一起使用。
Supabase是一个基于开源技术构建的后端即服务 (BaaS) 平台。它提供数据库、身份验证、REST API、实时订阅和存储等功能。
它提供包含托管 PostgreSQL 数据库的免费套餐。如果您刚开始一个新项目,这会很有用。
本指南介绍如何快速将 Supabase 提供的 Postgres 数据库连接到 Prisma 项目。此外,还有其他服务提供托管的 PostgreSQL 数据库,例如Heroku或Digital Ocean。
Prisma是一个开源的下一代 ORM(对象关系映射)。它由以下几个部分组成:
- Prisma Client:适用于 Node.js 和 TypeScript 的自动生成且类型安全的查询构建器。
- Prisma Migrate:迁移系统。
- Prisma Studio:用于查看和编辑数据库中数据的图形用户界面。
步骤 1:登录 Supabase
请在浏览器中访问https://app.supabase.com并使用 GitHub 登录。
步骤二:创建新项目
你会发现,系统已经为你创建了一个组织,其用户名与你登录时使用的 GitHub 用户名相同。
点击“新建项目”创建新项目,然后选择组织。
接下来,您需要为数据库提供名称并设置密码(稍后会用到)。最后,点击“创建新项目”。
项目创建完成后,您需要等待约 2 分钟,Supabase 才能完成数据库创建。
步骤 3:从项目设置中获取连接字符串
从侧边栏进入设置页面,然后导航至“数据库”选项卡。您将找到数据库连接字符串,其中包含您创建项目时提供的密码占位符。
步骤 4:测试连接
为了确保一切正常运行,让我们在 Prisma 项目中测试一下连接字符串。
如果你已经有了连接,你只需要将DATABASE_URL连接字符串(包括密码)设置到你的.env文件中,就可以使用了。
如果您没有 Prisma 项目,或者这是您第一次使用 Prisma,您将使用快速入门指南中的仓库。
克隆起始项目
进入你选择的目录,如果你使用的是 Windows 系统,请在终端中运行以下命令:
curl https://pris.ly/quickstart -L -o quickstart-master.tar.gz && tar -zxvf quickstart-master.tar.gz quickstart-master/typescript/starter && move quickstart-master\typescript\starter starter && rmdir /S /Q quickstart-master && del /Q quickstart-master.tar.gz
如果您使用的是 Mac OS 或 Linux 系统,请运行以下命令:
curl -L https://pris.ly/quickstart | tar -xz --strip=2 quickstart-master/typescript/starter
现在您可以进入该目录并安装项目的依赖项:
cd starter && npm install
项目结构概览
该项目已配置好 TypeScript,结构如下。
- 包含以下内容的目录
prisma:- 文件
dev.db:这是一个 SQLite 数据库。 - 文件
schema.prisma:用于定义不同的数据库模型以及它们之间的关系。
- 文件
- 文件
.env:包含DATABASE_URLPrisma 将使用的变量。 - 一个
script.ts文件:我们将使用 Prisma Client 在其中运行一些查询。
此启动器还预装了以下软件包:
@prisma/client:一个根据您的数据量身定制的自动生成且类型安全的查询构建器。prismaPrisma 的命令行界面 (CLI) 允许您初始化新的项目资源、生成 Prisma 客户端,并通过内省分析现有数据库结构,从而自动创建应用程序模型。
注意:Prisma 同时支持 JavaScript 和 TypeScript。但是,为了获得最佳的开发体验,强烈建议使用 TypeScript。
配置项目以使用 PostgreSQL
请删除该prisma/dev.db文件,因为我们将切换到 PostgreSQL。
接下来,在prisma/.env文件中,将变量的值更新为你在步骤 3DATABASE_URL中获取的连接字符串。URL 可能如下所示:
# prisma/.env
postgres://postgres:[YOUR-PASSWORD]@db.vdbnhqozmlzdsaejdxwr.supabase.co:5432/postgres
最后,在你的schema.prisma文件中,将provider“sqlite”更改为"postgresql"。
schema.prisma你的文件应该看起来像这样:
datasource db {
provider = "postgresql"
url = env("DATABASE_URL")
}
generator client {
provider = "prisma-client-js"
}
model Post {
id Int @id @default(autoincrement())
title String
content String?
published Boolean @default(false)
author User? @relation(fields: [authorId], references: [id])
authorId Int?
}
model User {
id Int @id @default(autoincrement())
email String @unique
name String?
posts Post[]
}
为了测试一切是否正常运行,请运行以下命令创建迁移:
prisma migrate dev --name init
您可以根据所做的更改,选择性地为迁移命名。由于这是项目的第一个迁移,因此您将标志设置--name为“init”。
如果一切正常,您应该在终端中看到以下消息:
Your database is now in sync with your schema.
✔ Generated Prisma Client (2.x.x) to ./node_modules/@prisma/client in 111ms
这将prisma/migrations在您的prisma目录中创建一个文件夹,并将您的 Prisma 架构与您的数据库架构同步。
注意:如果您想跳过创建迁移历史记录的过程,可以使用该
db push命令代替migrate dev。
如果你进入你的 Supabase 项目,在表格编辑器中,你应该会看到已经创建了两个表格,一个是表格,另一个Post是User表格。
搞定!您已成功将 Prisma 项目连接到托管在 Supabase 上的 PostgreSQL 数据库,并运行了第一次迁移。
使用 Supabase 进行连接池
如果你在无服务器环境中工作(例如托管在 AWS Lambda、Vercel 或 Netlify Functions 上的 Node.js 函数),你需要使用像PgBouncer这样的工具来设置连接池。这是因为每次函数调用都可能导致与数据库建立新的连接。
幸运的是,Supabase 项目支持使用 PgBouncer 进行连接管理,并且默认情况下已启用。
从侧边栏转到“数据库”页面,然后导航到“连接池设置” 。
运行迁移时,您需要使用非连接池连接 URL(例如我们在步骤 4中使用的那个)。但是,部署应用程序时,您需要使用连接池连接 URL,并?pgbouncer=true在 PostgreSQL 连接 URL 中添加相应的标志。URL 可能如下所示:
# prisma/.env
postgres://postgres:[YOUR-PASSWORD]@db.vdbnhqozmlzdsaejdxwr.supabase.co:6543/postgres?pgbouncer=true
Prisma Migrate 使用数据库事务来检查数据库和迁移表的当前状态。但是,迁移引擎设计为使用单个数据库连接,不支持与 PgBouncer 进行连接池协作。如果您尝试在任何使用 PgBouncer 进行连接池协作的环境中运行 Prisma Migrate 命令,则可能会看到以下错误:
Error: undefined: Database error
Error querying the database: db error: ERROR: prepared statement "s0" already exists
这是一个已知问题,目前正在处理中,您可以在此GitHub 问题中关注进展。
如果您想了解更多关于 Supabase 的信息,请查看文档。
如果您想了解更多关于 Prisma 的信息,请查看文档。此外,如果您有任何疑问或遇到任何问题,欢迎在仓库的讨论区发起讨论。
文章来源:https://dev.to/prisma/set-up-a-free-postgresql-database-on-supabase-to-use-with-prisma-3pk6





