не могу найти секвестр n: m таблиц отношений - PullRequest
0 голосов
/ 11 октября 2018

Я работаю с машинописью и сиквелизом, и у меня есть следующие таблицы: Пророк , Модель и Задача , и все они имеют отношение n: mдруг с другом, поэтому sequelize автоматически создает 3 другие таблицы: modelProphets , modelTasks и prophetTasks .У меня есть простой репозиторий для каждого из них, а модели и задачи имеют дополнительную функцию в репозитории:

public findWithoutProphet(): Promise<any> {
    const query = `SELECT models.name FROM models WHERE NOT EXISTS
        (SELECT modelProphets.modelName FROM modelProphets WHERE models.name = modelProphets.modelName);`;
    return this.database.rawQuery(query);
}

im модульное тестирование каждой функции репозитория, но дело в том, что когда я запускаю с использованием sequelizeдиалект 'sqlite', все работает нормально, но если я изменю его на свой локальный докер postgres и запуском снова, во время этого запроса выдается сообщение о том, что 'modelProphets' не существует (или prophetTasks, если я сначала запускаю задачу вместомодель).Все остальные функции репо, такие как создание, удаление, обновление, поиск, все работает отлично.Я даже проверил базу данных, используя pgAdmin4, и все таблицы отношений там есть, так что ...

почему sequelize выдает мне эту ошибку с postgresql, когда sqlite работает нормально?Различаются ли таблицы автоматических отношений для каждой БД?Нужно ли иметь отдельный репозиторий для каждой БД, которую я тестирую?

1 Ответ

0 голосов
/ 11 октября 2018

Я не слишком много работал с сиквелизом, но Postgres плохо работает с заглавными буквами.Поместите имя таблицы в двойные кавычки, если вы хотите, чтобы Postgres сохранил регистр для имен.

Заключение в кавычки идентификатора также делает его чувствительным к регистру, тогда как имена без кавычек всегда складываются в нижний регистр.Например, идентификаторы FOO, foo и "foo" в PostgreSQL считаются одинаковыми, но "Foo" и "FOO" отличаются друг от друга.(Свертывание имен без кавычек в нижний регистр в PostgreSQL несовместимо со стандартом SQL, который говорит, что имена без кавычек должны быть согнуты в верхний регистр. Таким образом, foo должен быть эквивалентен «FOO», а не «foo» в соответствии со стандартом. ЕслиВы хотите писать переносимые приложения. Рекомендуется всегда указывать конкретное имя или никогда его не указывать.)

из документов

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...