对不起,如果问题是基本的,我是初学者。
schema.prisma定义中是否有一种方法来强制一个列是对其他几个列的操作的结果?
例如第1栏=求和(第2栏+第3栏)?
都在同一张桌子上。这样,如果修改了第3列,那么第1列也会自动更新。
提前谢谢你
发布于 2021-08-25 11:36:34
虽然Prisma中本机不支持生成列,但您可以使用Postgres触发器来实现相同的行为。
下面是一个逐步示例,说明如何在使用Prisma时创建具有“生成”列值的数据库表。
1.使用可选的生成列创建Prisma模式
这应该是不言而喻的。虚构的例子:
model Foo {
id Int @id @default(autoincrement())
col1 Int
col2 Int
colSum Int? // colSum = col1 + col2
}2.写扳机
当colSum表上有创建或更新操作时,触发器将更新Foo字段的值。这就是它看起来的样子
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所示。
3. (可选)在迁移历史记录中添加触发器
为模型Foo创建一个新的迁移文件,但不要应用迁移,因为您将手动对其进行一些更改。您可以使用--create-only标志来完成这一任务。
npx prisma migrate dev --create-only 转到生成的迁移的migration.sql文件,最后粘贴步骤2中提供的SQL。
应用迁移
npx prisma migrate dev 现在,每当您对col1或col2进行更改时,它都应该自动反映在colSum中。
备选方案: Prisma中间件
带有触发器的解决方案在数据库服务器中执行操作。您还可以使用Prisma中间件在应用层进行这些更新。在Prisma中调用查询之前,只需手动执行相同的更新即可。
然而,在应用层有很多条件进行检查和执行,对性能产生了不必要的影响。对于您提到的简单用例,我不建议这样做。
https://stackoverflow.com/questions/68909400
复制相似问题