使用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你会遇到这个问题,但很难说清楚为什么和什么时候,这是主要问题。
1条答案
按热度按时间s4n0splo1#
现在可以定义视图实体依赖于
ViewEntity
装饰器的其他视图。来自文档https://github.com/typeorm/typeorm/blob/abb9079f2b2c5e02253b4c83ba10358d1a1f373f/docs/view-entities.md#what-is-view-entity
@ViewEntity()
接受以下选项:name
-视图名称。如果未指定,则从实体类名生成视图名称。database
-所选DB服务器中的数据库名称。schema
-架构名称。expression
-视图定义。必需参数。*
dependsOn
-当前视图所依赖的其他视图列表。如果您的视图在其定义中使用了另一个视图,则可以将其添加到此处,以便按照正确的顺序生成迁移。