功能 · 数据库

真正的数据库,已经接好

Tofu 自带托管 Postgres,​不用另开​数据库​账号。​付费​套餐里的​数据库​名额,​由你​所有的 app 共用。​部署时​说一声​要数据库,Tofu 一步建好、​接好,​然后才开始​构建,​所以第一次构建时​运行的​数据库​迁移​就能连上​数据库。免费​套餐含 1 个数据库。​如果 app 的服务器​代码跑​在免费​套餐上,​数据库随​第一次部署​一起创建;​否则等 app 上线后​再创建。​只要 app 还在线,​数据库​就一直保留。

查看文档配置 agent

你的 agent 会调用的工具

  • deploy
  • databaseCreate
  • databaseStatus
  • databaseReconcile
claude · ~/franks-kitchen示例

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 建一个。

  1. 创建数据库

    给这个 app 单独​建一个 Postgres 数据库,​地区由你定,​可选:Americas、EMEA 或 APAC。
  2. 等它运行正常

    最多等 2 分钟。​时间到了​数据库​还没连上,​就不会开始​构建,​部署​结果里​会写明它​当前的​状态。
  3. 写入连接设置

    把连接​设置写进 app 在托管​服务商​那边的​项目,​存成保密​值(写​入后谁​也读​不出来),​数据库的​公开证书​也放​在一起。​第一次部署时,Tofu 会在这一步建好​这个项目。
  4. 数据库就位,​再构建

    到​这一步才开始​构建。​如果你的构建​会运行​数据库​迁移,​第一次构建​就会在新​数据库上​把它们​跑完,​之后 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_KEYNext.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 的数据库​页面。​否则构建​可以运行​迁移,​和付费​套餐​一样。

package.jsonprisma
{
  "scripts": {
    "build": "prisma migrate deploy && next build"
  }
}
Drizzle 用 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 加在一起​算的。​哪些套餐​包含​数据库、​各有​几个,定价页上都写着。

粘贴​一段提示词。10 分钟上线

用你​已经在用的 agent,10 分钟,​把 app、​数据库、​域名和​登录​都弄好。

免费开始