簡體   English   中英

Prisma model 代 -

[英]Prisma model Generation -

如果問題是基本的,我很抱歉,我是初學者。

schema.prisma 定義中是否有一種方法可以強制將一個列作為對其他幾個列進行操作的結果?

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

所有這些都在同一張桌子上。 因此,如果修改了第 3 列,第 1 列也會自動更新。

先感謝您

雖然 Prisma 本身不支持 生成的列,但您可以使用 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.(可選)將觸發器添加到您的遷移歷史記錄

為 model Foo創建一個新的遷移文件,但不要應用遷移,因為您將手動對其進行一些更改。 您可以使用--create-only標志來執行此操作。

npx prisma migrate dev --create-only      

Go 到生成的遷移的migration.sql文件,最后粘貼步驟 2 中提供的 SQL。

應用遷移

npx prisma migrate dev  

現在,無論何時您對col1col2進行更改,它都應該自動反映在colSum中。

備選方案:Prisma 中間件

帶有觸發器的解決方案在數據庫服務器中執行操作。 您也可以使用Prisma Middleware在應用程序層進行這些更新。 在 Prisma 中調用查詢之前,只需手動執行相同的更新。

但是,有很多條件需要檢查,並且在應用層進行檢查會對性能產生不必要的影響。 對於您提到的簡單用例,我不建議這樣做。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM