【问题标题】:Prisma model Generation -棱镜模型生成 -
【发布时间】:2021-10-24 19:05:48
【问题描述】:

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

schema.prisma 定义中是否有办法强制 a 列成为对其他几个列的操作的结果?

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

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

提前谢谢你

【问题讨论】:

    标签: next.js prisma


    【解决方案1】:

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

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

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

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

    model Foo {
      id        Int      @id @default(autoincrement())
      col1 Int
      col2 Int
      colSum Int?  // colSum = col1 + col2
    }
    

    2。编写触发器

    只要对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 所示。

    3。 (可选)将触发器添加到您的迁移历史记录

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

    npx prisma migrate dev --create-only      
    

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

    应用迁移

    npx prisma migrate dev  
    

    现在,只要您对col1col2 进行更改,它就会自动反映在colSum 中。

    替代方案:Prisma 中间件

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

    但是,有很多条件需要检查,并且在应用层进行检查会产生不必要的性能影响。对于您提到的简单用例,我不建议这样做。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-06-12
      • 1970-01-01
      • 2017-02-01
      • 1970-01-01
      • 1970-01-01
      • 2012-01-04
      • 2012-01-05
      • 2018-10-25
      相关资源
      最近更新 更多