功能 · 数据库
真正的数据库,已经接好
Tofu 自带托管 Postgres,不用另开数据库账号。付费套餐里的数据库名额,由你所有的 app 共用。部署时说一声要数据库,Tofu 一步建好、接好,然后才开始构建,所以第一次构建时运行的数据库迁移就能连上数据库。免费套餐含 1 个数据库。如果 app 的服务器代码跑在免费套餐上,数据库随第一次部署一起创建;否则等 app 上线后再创建。只要 app 还在线,数据库就一直保留。
Take my restaurant app live, with a database.
tofu · setFramework nextjs
confirmed
tofu · deploy database: true
managed database ready · Postgres
DATABASE_URL + 5 more · write-only
build ready
HTTP 200 · publicly reachable
Live at https://franks-kitchen-3f9a1c07b2e4.trytofu.app
只需一步
创建、连接,再构建 按这个顺序,一次完成
部署时选上数据库就行:在控制台里勾选,agent 用 database: true,命令行用 deploy --database。每个数据库都占套餐里的一个名额,所以默认不会建,只有你同意,才会给这个 app 建一个。
创建数据库
给这个 app 单独建一个 Postgres 数据库,地区由你定,可选:Americas、EMEA 或 APAC。等它运行正常
最多等 2 分钟。时间到了数据库还没连上,就不会开始构建,部署结果里会写明它当前的状态。写入连接设置
把连接设置写进 app 在托管服务商那边的项目,存成保密值(写入后谁也读不出来),数据库的公开证书也放在一起。第一次部署时,Tofu 会在这一步建好这个项目。数据库就位,再构建
到这一步才开始构建。如果你的构建会运行数据库迁移,第一次构建就会在新数据库上把它们跑完,之后 app 才上线。
之前在“数据库”页面建好的,下次部署时也一样:先连上,再构建。
你的 app 会收到什么
直接接好, 谁也看不到
Tofu 把连接设置直接写进托管服务商的环境变量,存成保密值(写入后谁也读不出来)。数据库的公开证书不用保密,存成普通值。Tofu 自己只留变量名,别的都不存,也不会用到 service-role 密钥。
| 变量 | 谁会收到 |
|---|---|
| DATABASE_URL | 每个 app:连接字符串,走数据库服务商的事务连接池。 |
| SUPABASE_URL | 每个 app:数据库项目的公开地址。 |
| SUPABASE_ANON_KEY | 每个 app:数据库项目的公开密钥。 |
| SUPABASE_CA_CERT | 每个 app:数据库服务器的公开根证书,让你的代码能确认连上的正是你的数据库。不用保密。 |
| ‹prefix›SUPABASE_URL‹prefix›SUPABASE_ANON_KEY‹prefix›SUPABASE_PUBLISHABLE_KEY | Next.js (NEXT_PUBLIC_)、Vite (VITE_)和 Astro (PUBLIC_) app:多给一份公开地址和公开密钥,变量名换成浏览器端代码读得到的写法。 |
其他框架的 app 只会拿到服务器端的变量名,用 Python、Go 或 JavaScript 写的服务器 app 也一样,因为浏览器端该用什么前缀,Tofu 不会去猜。
数据库连上之前,先确认好 app 的框架。浏览器端的变量名是在连上那一刻按框架定的,之后再改框架,也不会补上。
免费套餐下,如果你的 app 放在 Tofu 的共享静态托管上,页面就直接在浏览器里连数据库。所以它只拿到公开地址和公开密钥(变量名以 VITE_ 开头),没有 DATABASE_URL,也没有证书。没放在共享静态托管上的 app,拿到的变量和付费套餐一样。
迁移交给构建,每次部署自动运行
数据库一开始特意留空:表结构写在你的代码仓库里,就归仓库管。把迁移放进构建命令,每次部署,表结构都跟着代码一起上线,永远不会掉队。数据库密码也不用复制到别处。
从 2026 年 10 月 30 日起,在 public 里新建的表,Supabase 不再自动开放给 app 页面用的数据库角色。所以建表的迁移里,要写上授权语句。select 授给 anon,只限未登录访客可以看的内容。select, insert, update, delete 授给 authenticated。服务器代码如果用到 service_role,也给它同样的权限。视图要另外加一条 grant select,创建时带上 security_invoker = true,这样视图底下的数据仍由原表的访问规则把关。
构建里运行的迁移一旦出错,这次构建就会失败,已上线的版本照常运行。出错前已经执行的 SQL 语句不会撤销。
如果你 app 的数据库页面写着由 Tofu 运行迁移,每次部署前,Tofu 会先运行 supabase/migrations 文件夹里的文件。只要有一个出错,Tofu 就会在构建开始前停止这次部署,已上线的版本照常运行。
表结构会跟着上线,数据不会。构建里运行的迁移会在这个数据库上执行。只存在你电脑上的数据不会跟过来,除非有迁移把它们写进去。
免费套餐下,如果你的 app 用的是 Tofu 的共享静态托管,构建不运行迁移。这时表要在构建之外建,具体怎么建,看你 app 的数据库页面。否则构建可以运行迁移,和付费套餐一样。
{
"scripts": {
"build": "prisma migrate deploy && next build"
}
}drizzle-kit migrate,Supabase CLI 用 supabase db push --db-url "$DATABASE_URL",纯 SQL 迁移就用仓库里现成的工具。查看数据
表格编辑器, 不是 SQL 命令行
数据库页面会列出数据库里的表,一页一页翻看每张表的行,不用给任何人开放命令行权限。
查看
数据库里每张表都能看,每页 25 行
能看到 app 自己的表,也能看到数据库服务自带的表,比如存放登录账号的表。自带的表只能看,不能改;密码和 token 默认隐藏,点“显示”才会出现。每列的类型和主键,还有这张表有没有开启行级安全,都会列出来。行数是数据库估算的,页面上会注明。
修改
写入默认关闭,你打开才能改数据
每个 app 都有一个写入开关。打开后,每次新增、修改或删除都只动一行,每一条都要你确认。如果你编辑期间这一行已在别处改过,会提醒你,不会覆盖那次改动。
从不
不改表结构,不执行 SQL,不导出数据
编辑器不能新建、修改或删除表结构,也不能执行 SQL。数据只在屏幕上一页一页显示,不能导出。
仅限你本人
在你的控制台里,不在 agent 手里
任何 agent 都不能读写表里的行。编辑器以数据库自带的管理员身份连接,不受行级安全规则限制,能看到所有的行,页面上也会注明。
归你所有
数据是你的, 要走也带得走
可以搬到你自己的 Supabase 组织
你提出申请后,数据库会搬到你名下的 Supabase 组织,所在区域不变。搬迁要先和你确认细节,还要经过审核,不是点一下按钮就能完成。
连接字符串,需要时就能拿到
想让本地工具连上数据库,或者想手动改一次数据,点“显示数据库密钥”就能拿到连接字符串。这一步只有所有者能做,每次查看都会留下记录。任何 agent 都拿不到。
你说删,才会删
只有所有者能删除数据库:输入 app 的名字确认后,整个数据库连同表结构和数据都会删掉,也不会另外留备份。
还没做
只有 Next.js、Vite 和 Astro 能拿到浏览器端的环境变量名。 其他框架拿到的是服务器端的环境变量名。另外,Python 和 Go 的 app 还没接上托管数据库完整跑过一遍。
数据库密码还不能更换。 Tofu 控制台里没有改这个密码的地方。如果怀疑密码泄露,请联系我们。
数据库的运作方式
Tofu 不替你设计数据表,也没有 SQL 控制台。 数据表由你 app 自己的迁移文件创建。如果数据库页面显示由 Tofu 负责迁移,Tofu 会在每次更新前运行 supabase/migrations 里的文件;否则,迁移要么在构建时执行,要么由你用数据库密钥在自己电脑上执行。出于安全考虑,Tofu 不做 SQL 控制台:上传的代码一律当作不可信,而 Tofu 的一个管理凭据就能连到所有托管数据库。
本地数据不会跟着上线。 只存在于你电脑上的数据,不会进到这个数据库,除非有迁移把它们写进去。
Tofu 不预先建数据表,也不预设行级安全策略。 数据库一开始是空的。app 用到的数据表和行级安全策略,都由你的迁移文件创建。
能有几个数据库,要看你的套餐。 这个数量是你所有 app 加在一起算的。哪些套餐包含数据库、各有几个,定价页上都写着。
说说你想做什么 app,或者带上 agent 已经做好的 app。Tofu 帮你上线。
任何 coding agent 都能用
© 2026 Tofu
trytofu.ai
本页由英文翻译;如有内容冲突,请以英文原版为准。