#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.
Однако существует множество условий для проверки, и выполнение этого на прикладном уровне оказывает ненужное влияние на производительность. Я бы не рекомендовал это для простого варианта использования, о котором вы упомянули.