当前位置: 首页 > 面试题库 >

具有相互依赖关系的运行SQL脚本

柳威
2023-03-14
问题内容

我有一个在后端使用postgres数据库的项目,并且我正在创建一个Dockerfile,该文件可以自动设置数据库的本地开发实例。该数据库包含大量功能,并且这些功能在历史上一直存储在上下文相关的sql文件中,例如,users.sql,companys.sql。这样做很好,因为每当进行更改时,我都可以简单地执行REPLACE所有视图和删除/重新创建所有函数的相关sql文件。

但是,当尝试在一个新的postgres实例上运行这些脚本时(在CREATE所有表之后),它们会失败,因为大多数视图/函数都引用了尚未定义的其他视图函数。

我已经开始研究是否可以按特定顺序运行脚本来避免此问题,但是由于考虑到这些脚本的设计目的并非出于此目的,因此这可能是不可能的,并且存在大量实体,因此是最重要的任务。

除了重组脚本之外,还有什么方法可以实现这一目标?


问题答案:

您可以编写一个简单的递归查询,该查询以不依赖于其他视图的所有视图开头,然后以递归方式添加依赖于这些视图的视图。然后以正确的顺序输出这些视图的视图定义,您已经获得了脚本:

WITH RECURSIVE viewids AS (
   /* all views that don't depend on other views */
   SELECT t.oid, 1 as level
   FROM pg_class t
      JOIN pg_rewrite AS r ON r.ev_class = t.oid
   WHERE r.rulename = '_RETURN'
     AND t.relkind = 'v'
     AND t.relnamespace NOT IN ('pg_catalog'::regnamespace,
                                'information_schema'::regnamespace,
                                'pg_toast'::regnamespace)
     AND NOT EXISTS (
            /* depends on a view */
            SELECT 1
            FROM pg_depend AS d
               JOIN pg_class AS t2 ON d.refobjid = t2.oid
            WHERE d.objid = r.oid
              AND d.classid = 'pg_rewrite'::regclass
              AND d.refclassid = 'pg_class'::regclass
              AND d.deptype = 'n'
              AND d.refobjsubid <> 0
              AND t2.relkind = 'v'
         )
     AND NOT EXISTS (
            /* depends on an extension */
            SELECT 1
            FROM pg_depend
            WHERE objid = t.oid
              AND classid = 'pg_class'::regclass
              AND refclassid = 'pg_extension'::regclass
              AND deptype = 'e'
         )
UNION ALL
   /* all views that depend on these views */
   SELECT t.oid, viewids.level + 1
   FROM pg_class AS t
      JOIN pg_rewrite AS r ON r.ev_class = t.oid
      JOIN pg_depend AS d ON d.objid = r.oid
      JOIN viewids ON viewids.oid = d.refobjid
   WHERE t.relkind = 'v'
     AND r.rulename = '_RETURN'
     AND d.classid = 'pg_rewrite'::regclass                            
     AND d.refclassid = 'pg_class'::regclass
     AND d.deptype = 'n'
     AND d.refobjsubid <> 0
)
/* order the views by level, eliminating duplicates */
SELECT format('CREATE VIEW %s AS%s',
              oid::regclass,
              pg_get_viewdef(oid::regclass))
FROM viewids
GROUP BY oid
ORDER BY max(level);


 类似资料:
  • 我有一个多模块Maven项目,其中包含子模块ModuleA和ModuleB等。ModuleA将ModuleB列为依赖项。但是,当仅构建模块A时,Maven不会解决模块B的依赖关系-导致。我想避免构建整个父级以使构建更快。目前我发现让它工作的唯一方法是使用exec插件和脚本,将父项目称为“ModuleB, ModuleA”,这意味着我必须在每次依赖项更改时更改脚本(例如添加ModuleC)。 是否有

  • 作为另一个想法: 更新:我可以添加一个例程来模拟调用API的用例,如下所示: 然后我可以将第一行更改为下面建议的

  • 我知道循环依赖通常是不被鼓励的——然而,在C#和TypeScript中,我有时发现它们很有用。这可能是因为我缺乏python方面的经验,也可能是因为我的思维方式不对,或者是因为我没有找到谷歌应该使用的词语。我将如何解决以下问题? 我试图创建一个处理请求的类,每个处理事件都伴随着一个上下文。所以,我想创建handler类和context类,但它们是依赖的,linter在第2行给了我问题,说Handl

  • DB是这样设置的。 AppDB AppLogDB AppAuditDB apparchivedb ... 我有一些例子,其中AppDB有引用其他表的视图/过程/等。也有其他DBs访问AppDB的情况(即ArchiveDB存储过程将从AppDB拉出)。 有了不同数据库之间的这种依赖关系,FlyWay是否可以按照所需的顺序处理迁移/清理?例如: 如果我有这样的脚本顺序 AppDB v1__create

  • 问题内容: 在Java应用程序中,我需要使用当前在python中实现的特定图像处理算法。知道此脚本使用了Numpy库,什么是最好的方法? 我尝试使用jythonc编译器将脚本编译为Java,但似乎它不支持对Numpy等本机库的依赖。我也尝试使用Jepp,但是在导入Numpy时也出现ImportError。 有什么建议吗? 问题答案: 如果使用的是Numpy,则可能只需要使用C Python,因为它

  • 问题内容: 我已经搜索了很多,但是我发现的主要是python中的递归编程示例。因此,问题来了: 我该如何实现? 问题答案: 一切在Python中都是动态的-甚至是类声明。在初始声明之后,没有什么可以阻止您修改类的内容的: 注意:如果您不太熟悉Python,则该关键字仅允许您说“这里什么都没有”-除非A类的空值与本例中的一样空,否则它并不重要!