Поколение моделей Prisma —

#next.js #prisma

Вопрос:

Заранее извините, если вопрос простой, я новичок.

Существует ли способ в определении schema.prisma принудительно сделать столбец a результатом операции над несколькими другими столбцами ?

например, столбец 1 = Сумма ( столбец 2 столбец 3) ?

Все это в одной таблице. Таким образом, если столбец 3 будет изменен, столбец 1 также будет автоматически обновлен.

Заранее спасибо

Ответ №1:

Хотя сгенерированные столбцы изначально не поддерживаются в 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 файлу сгенерированной миграции и в конце вставьте SQL, указанный на шаге 2.

Примените миграцию

 npx prisma migrate dev  
 

Теперь каждый раз , когда вы вносите изменения в col1 или col2 , это должно автоматически отражаться в colSum .

Альтернатива: Промежуточное программное обеспечение Prisma

Решение с триггерами выполняет операции на сервере базы данных. Вы также можете выполнить эти обновления на уровне приложений с помощью промежуточного программного обеспечения Prisma. Просто выполните это же обновление вручную, прежде чем запрос будет вызван в Prisma.

Однако существует множество условий для проверки, и выполнение этого на прикладном уровне оказывает ненужное влияние на производительность. Я бы не рекомендовал это для простого варианта использования, о котором вы упомянули.