Таблица Prisma ORM сгенерирована с неправильным именем

Вопрос или проблема

Я использую Prisma ORM в приложении на Express. У меня есть таблица с именем “sessions” во множественном числе и определение в единственном числе, сопоставленное с именем таблицы с помощью @@map, вот так

model Session {
  sid String  @db.VarChar(100) @id 
  sess Json
  expire DateTime @default(now()) 

  @@map(name: "sessions")
}

Но все равно, когда я попытался использовать это, мне показало:

error: relation "session" does not exist
    at /usr/src/app/node_modules/.pnpm/[email protected][email protected]/node_modules/pg-pool/index.js:45:11
    at process.processTicksAndRejections (node:internal/process/task_queues:95:5)
    at async PGStore._asyncQuery (/usr/src/app/node_modules/.pnpm/[email protected]/node_modules/connect-pg-simple/index.js:322:21)

Я несколько раз генерировал клиент, но все равно. Я не нашел никакого объяснения и не смог определить, где генерируется код, так что не смог понять, почему мой объект Session не сопоставляется с “sessions”, а вместо этого с “session”

Любая помощь будет очень appreciated.

Примечание:

Я использую node 20.18.0, express 4.21.1, prisma 5.21.1, prisma-client 5.21.1

Кстати, я уже сгенерировал клиент и создал таблицы. Это не проблема “о, я забыл создать таблицы в базе данных” вовсе. На самом деле, есть другая модель, User, сопоставленная с таблицей users тем же образом, и она работает прекрасно.

Хорошо, я разобрался. Проблема не была связана с Prisma, а с express-session. express-session обрабатывает таблицу с именем “session”, а не sessions. Я не знаю, возможно ли изменить имя, но не вижу причин это делать. Поэтому я просто изменил имя в миграциях, снова сгенерировал таблицы, удалил сопоставление, и это сработало.

Ответ или решение

Вопрос, с которым вы столкнулись при использовании Prisma ORM в приложении на основе Express, касается неправильно сгенерированного имени таблицы. Вы создали модель Session, ожидая, что она будет связана с таблицей с именем sessions, однако система выдала ошибку, указывающую на то, что таблица с именем session не существует. Понимание этого поведения связано с особенностями работы Prisma и express-session.

Структура проблемы

Ваша модель явно указывает на таблицу sessions с помощью конструкции @@map, что выглядит корректно:

model Session {
  sid String  @db.VarChar(100) @id 
  sess Json
  expire DateTime @default(now()) 

  @@map(name: "sessions")
}

Однако при попытке работы с этой моделью вы получили ошибку:

error: relation "session" does not exist

Причины возникновения проблемы

  1. Производные имена таблиц: В Prisma имена таблиц генерируются на основе имён моделей. Если вы не указали явное сопоставление или работаете с библиотеками, ожидающими конвенций именования, это может привести к неверному сопоставлению.

  2. Библиотека express-session: Как вы сами отметили, express-session по умолчанию использует таблицу с именем session, что вводит в заблуждение при попытке связать ее с вашей моделью, которая определяется как sessions.

Решение

Вы нашли выход из ситуации, изменив имя таблицы в своей базе данных и сгенерировав таблицы заново. Это вполне разумный подход. Теперь обсудим несколько дополнительных вариантов, если вы захотите изменить поведение в будущем.

  1. Изменение имени таблицы: Если вы решите продолжить использование express-session, рассмотрите возможность изменить имя таблицы, чтобы избежать конфликта. Вы можете сделать это в рамках миграций Prisma.

  2. Настройка express-session: Если вы хотите сохранить текущее название таблицы, возможно, будет полезно настроить express-session так, чтобы он использовал другую таблицу. Это потребует дополнительных усилий по конфигурации.

Заключение

Важно понимать, что конфликты имен могут возникать из-за особенностей интеграции различных библиотек. В вашем случае ошибка не была связана с Prismа, а скорее с взаимодействием между mаппингом таблиц и библиотекой для управления сессиями.

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

Оцените материал
Добавить комментарий

Капча загружается...