Проблемы с порядком синхронизации (создания) объектов вида TypeORM

#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 )
 

Шаги по воспроизведению

Создавайте представления, которые зависят друг от друга, вы столкнетесь с этой проблемой, но трудно точно сказать, почему и когда, это основная проблема.