使用Prisma多Schema连接Supabase时迁移失败求助
问题根源
- Supabase的
storageschema是平台内置组件,其中storage.buckets和storage.objects表默认配置了外键约束,关联auth.users表的id字段(比如owner字段的外键依赖)。 - 当你在Prisma数据源中包含
authschema并执行prisma db push时,Prisma会尝试按照你的Schema定义同步auth.users表,甚至可能触发删除重建操作,但数据库会因为storage表的外键依赖阻止这个操作,从而抛出P3016错误。 - 你尝试拉取数据库Schema、删除重建
users表无效,核心原因是storage的外键约束始终存在,且Prisma默认不会处理它未纳入管理的storageschema内的对象。
解决方案
排除Prisma对
auth.users表的管理
在Prisma Schema的数据源配置中,明确排除auth.users表,让Supabase自行管理这个内置表:datasource db { provider = "postgresql" url = env("DATABASE_URL") schemas = ["public", "auth"] previewFeatures = ["multiSchema"] // 排除auth下的users表,避免Prisma尝试修改它 excludeTables = ["auth.users"] }如果你在
authschema下只有自定义表,也可以用includeTables仅指定需要管理的表,比如includeTables = ["auth.your_custom_table"]。临时移除外键约束(仅必要时使用)
若你确实需要修改auth.users表,可先临时移除storage表的外键约束,完成修改后再恢复:- 执行SQL删除外键:
ALTER TABLE storage.buckets DROP CONSTRAINT IF EXISTS buckets_owner_fkey; ALTER TABLE storage.objects DROP CONSTRAINT IF EXISTS objects_owner_fkey; - 执行
prisma db push完成表结构修改 - 重新添加外键约束:
ALTER TABLE storage.buckets ADD CONSTRAINT buckets_owner_fkey FOREIGN KEY (owner) REFERENCES auth.users(id); ALTER TABLE storage.objects ADD CONSTRAINT objects_owner_fkey FOREIGN KEY (owner) REFERENCES auth.users(id);
注意:此操作可能影响Supabase存储功能,执行前务必备份数据。
- 执行SQL删除外键:
拉取Schema后标记忽略
auth.users
先执行prisma db pull将Supabase内置的auth.users和storage相关表结构同步到Prisma Schema,然后给auth.users模型添加@@ignore标记,让Prisma忽略对它的管理:model users { id String @id @default(cuid()) email String? @unique // 其他同步过来的字段... @@schema("auth") @@ignore }这样Prisma就不会再尝试修改或删除该表,同时你可以正常管理自定义模型。
内容的提问来源于stack exchange,提问作者Fares
相关产品推荐
相关产品推荐

