【发布时间】:2021-10-24 19:05:48
【问题描述】:
如果问题是基本的,请提前抱歉,我是初学者。
schema.prisma 定义中是否有办法强制 a 列成为对其他几个列的操作的结果?
例如第 1 列 = 总和(第 2 列 + 第 3 列)?
所有这些都在同一张桌子上。 这样如果第 3 列被修改,第 1 列也会自动更新。
提前谢谢你
【问题讨论】:
如果问题是基本的,请提前抱歉,我是初学者。
schema.prisma 定义中是否有办法强制 a 列成为对其他几个列的操作的结果?
例如第 1 列 = 总和(第 2 列 + 第 3 列)?
所有这些都在同一张桌子上。 这样如果第 3 列被修改,第 1 列也会自动更新。
提前谢谢你
【问题讨论】:
虽然 Prisma 本身不支持 generated columns,但您可以使用 Postgres 触发器来实现相同的行为。
以下是使用 Prisma 时如何创建具有“生成”列值的数据库表的分步示例。
这应该是不言而喻的。虚拟示例:
model Foo {
id Int @id @default(autoincrement())
col1 Int
col2 Int
colSum Int? // colSum = col1 + col2
}
只要对Foo 表进行创建或更新操作,触发器就会更新colSum 字段的值。就是这个样子
CREATE OR REPLACE FUNCTION trigger_col_update()
RETURNS TRIGGER
AS $$
BEGIN
NEW."colSum" := NEW."col1" + NEW."col2";
RETURN NEW;
END;
$$ LANGUAGE plpgsql;
CREATE TRIGGER set_col_trigger
BEFORE INSERT OR UPDATE ON "Foo"
FOR EACH ROW
EXECUTE PROCEDURE trigger_col_update();
您可以为您的数据库手动调用这些 SQL 命令,但我建议将它们存储在您的迁移历史记录中,如步骤 3 所示。
为模型Foo 创建一个新的迁移文件,但不要应用迁移,因为您将手动对其进行一些更改。您可以使用--create-only 标志来执行此操作。
npx prisma migrate dev --create-only
转到生成的迁移的migration.sql 文件,最后粘贴步骤 2 中提供的 SQL。
应用迁移
npx prisma migrate dev
现在,只要您对col1 或col2 进行更改,它就会自动反映在colSum 中。
带有触发器的解决方案在数据库服务器中执行操作。您也可以使用Prisma Middleware 在应用层中进行这些更新。只需在 Prisma 中调用查询之前手动执行相同的更新。
但是,有很多条件需要检查,并且在应用层进行检查会产生不必要的性能影响。对于您提到的简单用例,我不建议这样做。
【讨论】: