#sql #node.js #typescript #orm #typeorm
Вопрос:
Используя TypeORM, я пытаюсь создать объекты просмотра, которые зависят друг от друга, например, «Вид B» выберите из «Вид A». Что бы я ни делал, я не могу заставить объекты просмотра создаваться в порядке зависимости. Иногда сначала создается «Представление B», и процесс синхронизации завершается неудачно, потому что он не может найти «Представление A», так как оно еще не создано.
Ошибка:
Ошибка запроса: отношение «public.course_item_view» не существует
Решения, которые я пробовал:
- Переименование файлов ViewEntity (чтобы проверить, использует ли система порядок ABC для имен файлов)
- Переименование классов ViewEntity (чтобы проверить, использует ли система порядок ABC для имен классов)
- Переименование свойства ViewEntity «имя» (чтобы проверить, использует ли система порядок ABC для конечных имен представлений SQL)
- Изменение порядка ссылок на класс ViewEntity в массиве «сущности: []» параметров подключения
- Изменение порядка импорта класса ViewEntity в файле, в котором я объявляю параметры подключения
- Удаление/Повторное добавление файла (чтобы проверить, использует ли система порядок на основе даты создания)
- Изменение файлов (чтобы проверить, использует ли система порядок на основе даты изменения)
Все это потерпело неудачу. Я не могу понять, как система определяет порядок, в котором создаются представления. Любая помощь будет ОЧЕНЬ признательна!!
Ожидаемое Поведение
Представления должны создаваться в порядке, который либо задается свойством внутри представлений, либо порядок должен быть разрешен автоматически из операторов SELECT (массив зависимостей), либо он должен основываться на порядке, в котором я ссылаюсь на значения представления в массиве «сущности: []» параметров подключения, или любое другое решение было бы идеальным, где можно определить порядок, в котором создаются значения представления.
Фактическое Поведение
Элементы просмотра создаются в порядке, который я, честно говоря, не могу понять. Иногда зависимое представление создается до представления, от которого оно зависит. Это приводит к сбою синхронизации.
File name: «CourseItemView» which resolves to: «course_item_view»
@ViewEntity({
expression: `
SELECT
"uvcv"."userId",
"uvcv"."courseId",
"uvcv"."videoId",
CAST (null AS integer) AS "examId",
"uvcv"."isComplete" AS "isComplete"
FROM public.video_completed_view AS "uvcv"
UNION ALL
SELECT
"uecv"."userId",
"uecv"."courseId",
CAST (null AS integer) AS "videoId",
"uecv"."examId",
"uecv"."isCompleted" AS "isComplete"
FROM public.user_exam_completed_view AS "uecv"
.
.
File name: «CourseItemStateView» which resolves to: «course_item_state_view»
This DEPENDS on the «course_item_view», as you can see in the SQL
@ViewEntity({
expression: `
SELECT
"course"."id" AS "courseId",
"user"."id" AS "userId",
"civ"."videoId" AS "videoId",
"civ"."isComplete" AS "isVideoCompleted",
"civ"."examId" AS "examId",
"civ"."isComplete" AS "isExamCompleted"
FROM public."course"
LEFT JOIN public."user"
ON 1 = 1
LEFT JOIN public.course_item_view AS "civ" ------------------- HERE
ON "civ"."courseId" = "course"."id"
AND "civ"."userId" = "user"."id"
ORDER BY "civ"."videoId","civ"."examId"
`
})
.
.
My connection options:
const postgresOptions = {
// properties, passwords etc...
entities: [
// entities....
// ...
// ...
// views
VideoCompletedView,
UserExamCompletedView,
UserExamAnswerSessionView,
UserVideoMaxWatchedSecondsView,
CourseItemView, --------------------------------HERE
CourseItemStateView ---------------------------HERE
],
} as ConnectionOptions;
createConnection(postgresOptions )
Шаги по воспроизведению
Создавайте представления, которые зависят друг от друга, вы столкнетесь с этой проблемой, но трудно точно сказать, почему и когда, это основная проблема.