Вопрос или проблема
Я использую 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
Причины возникновения проблемы
-
Производные имена таблиц: В Prisma имена таблиц генерируются на основе имён моделей. Если вы не указали явное сопоставление или работаете с библиотеками, ожидающими конвенций именования, это может привести к неверному сопоставлению.
-
Библиотека express-session: Как вы сами отметили, express-session по умолчанию использует таблицу с именем
session
, что вводит в заблуждение при попытке связать ее с вашей моделью, которая определяется какsessions
.
Решение
Вы нашли выход из ситуации, изменив имя таблицы в своей базе данных и сгенерировав таблицы заново. Это вполне разумный подход. Теперь обсудим несколько дополнительных вариантов, если вы захотите изменить поведение в будущем.
-
Изменение имени таблицы: Если вы решите продолжить использование express-session, рассмотрите возможность изменить имя таблицы, чтобы избежать конфликта. Вы можете сделать это в рамках миграций Prisma.
-
Настройка express-session: Если вы хотите сохранить текущее название таблицы, возможно, будет полезно настроить express-session так, чтобы он использовал другую таблицу. Это потребует дополнительных усилий по конфигурации.
Заключение
Важно понимать, что конфликты имен могут возникать из-за особенностей интеграции различных библиотек. В вашем случае ошибка не была связана с Prismа, а скорее с взаимодействием между mаппингом таблиц и библиотекой для управления сессиями.
Ваше успешное решение проблемы показало гибкость и адаптивность. Если в будущем у вас возникнут новые вопросы по этому или другим аспектам работы с Prisma, не стесняйтесь обращаться за поддержкой. Подобные случаи содержат много уроков, которые помогают углубить знание о компонентах вашего стека технологии.