Prisma 模型生成 -

lt5*_*512 1 next.js prisma

如果问题很基本,请提前抱歉,我是初学者。

schema.prisma 定义中是否有一种方法可以强制某个列成为对其他几个列进行操作的结果?

例如,第 1 列 = 总和(第 2 列 + 第 3 列)?

所有这些都在同一张表中。这样,如果第 3 列被修改,第 1 列也会自动更新。

先感谢您

Tas*_*mam 5

虽然Prisma 本身不支持生成的列,但您可以使用 Postgres 触发器来实现相同的行为。

以下是使用 Prisma 时如何创建具有“生成”列值的数据库表的分步示例。

1. 使用可选的生成列创建 Prisma 架构

这应该是不言而喻的。虚拟示例:

model Foo {
  id        Int      @id @default(autoincrement())
  col1 Int
  col2 Int
  colSum Int?  // colSum = col1 + col2
}
Run Code Online (Sandbox Code Playgroud)

2. 编写触发器

colSum每当表上有创建或更新操作时,触发器都会更新字段的值Foo。这就是它的样子

model Foo {
  id        Int      @id @default(autoincrement())
  col1 Int
  col2 Int
  colSum Int?  // colSum = col1 + col2
}
Run Code Online (Sandbox Code Playgroud)

您可以为数据库手动调用这些 SQL 命令,但我建议将它们存储在迁移历史记录中,如步骤 3 所示。

3.(可选)将触发器添加到迁移历史记录中

为模型创建一个新的迁移文件Foo,但不应用迁移,因为您将手动对其进行一些更改。您可以使用--create-only标志来做到这一点。

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();

Run Code Online (Sandbox Code Playgroud)

转到migration.sql生成的迁移文件,最后粘贴步骤 2 中提供的 SQL。

应用迁移

npx prisma migrate dev --create-only      
Run Code Online (Sandbox Code Playgroud)

现在,每当您对col1or进行更改时col2,它都应该自动反映在 中colSum

替代方案:Prisma 中间件

带有触发器的解决方案在数据库服务器中执行操作。您还可以使用Prisma Middleware在应用程序层进行这些更新。只需在 Prisma 中调用查询之前手动执行相同的更新即可。

然而,有很多条件需要检查,并且在应用程序层执行这些操作会对性能产生不必要的影响。对于您提到的简单用例,我不会推荐这样做。