NodeJS TypeORM视图实体同步(创建)顺序问题

yk9xbfzb  于 2023-05-17  发布在  Node.js
关注(0)|答案(1)|浏览(174)

使用TypeORM,我试图创建相互依赖的ViewEntities,例如“View B”从“View A”中选择。无论我做什么,我都无法按照依赖关系的顺序创建ViewEntities。有时先创建“视图B”,同步过程失败,因为它找不到“视图A”,因为它还没有创建。
错误:
QueryFailedError:您访问的页面不存在!

我尝试过的解决方案:

  • 重命名ViewEntity文件(检查系统是否对文件名使用ABC排序)
  • 重命名ViewEntity类(检查系统是否对类名使用ABC排序)
  • 重命名ViewEntity的“name”属性(检查系统是否对最终的SQL视图名称使用ABC排序)
  • 重新排序“实体:[]”连接选项的数组
  • 在我声明连接选项的文件中重新排序ViewEntity类导入
  • 再次删除/添加文件(检查系统是否使用基于创建日期的排序)
  • 修改文件(检查系统是否使用基于修改日期的排序)

所有这些都失败了。我不知道系统是如何决定视图创建的顺序的。任何帮助将不胜感激!!

预期行为

视图的创建顺序应该由视图内部的属性指定,或者顺序应该从SELECT语句(依赖数组)自动解析,或者应该基于我引用“实体:[]”数组的连接选项,或者任何其他解决方案将是完美的,其中可以确定创建ViewEntity的顺序。

实际行为

ViewEntites是以一种我真的无法理解的顺序创建的。有时候,依赖ViewEntity会在它所依赖的ViewEntity之前创建。这将导致同步失败。
文件名:“CourseItemView”,解析为:“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"
.
.

文件名:“CourseItemStateView”,解析为:“course_item_state_view”这取决于“course_item_view”,正如您在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"
`
})
.
.

我的连接选项:

const postgresOptions = {
        // properties, passwords etc...
        entities: [
           // entities....
           // ...
           // ...

            // views
            VideoCompletedView,
            UserExamCompletedView,
            UserExamAnswerSessionView,
            UserVideoMaxWatchedSecondsView,
            CourseItemView, --------------------------------HERE
            CourseItemStateView ---------------------------HERE
        ],
    } as ConnectionOptions;

createConnection(postgresOptions )

复制步骤

创建相互依赖的ViewEntites你会遇到这个问题,但很难说清楚为什么和什么时候,这是主要问题。

s4n0splo

s4n0splo1#

现在可以定义视图实体依赖于ViewEntity装饰器的其他视图。

@ViewEntity({
    expression: `SELECT * FROM 1`,
    dependsOn:[CourseItemView]
})

来自文档https://github.com/typeorm/typeorm/blob/abb9079f2b2c5e02253b4c83ba10358d1a1f373f/docs/view-entities.md#what-is-view-entity
@ViewEntity()接受以下选项:

  • name-视图名称。如果未指定,则从实体类名生成视图名称。
  • database-所选DB服务器中的数据库名称。
  • schema-架构名称。
  • expression-视图定义。必需参数。
    *dependsOn-当前视图所依赖的其他视图列表。如果您的视图在其定义中使用了另一个视图,则可以将其添加到此处,以便按照正确的顺序生成迁移。

相关问题