Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/windows/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
postgresql文件未正确执行_Postgresql_Transactions - Fatal编程技术网

postgresql文件未正确执行

postgresql文件未正确执行,postgresql,transactions,Postgresql,Transactions,背景 我有一个小程序,可以循环遍历一堆.sql文件,并在postgresql数据库上运行它们。每个.sql文件应该做的最后一件事是更新特定表中的版本号 例如,考虑以下文件列表: file1.sql file2.sql 文件按降序运行。file2,然后file1每个文件中的sql看起来类似于: \c widgets; DO $$ BEGIN -- anonymous function starts -- BEGIN -- start transaction I

背景

我有一个小程序,可以循环遍历一堆.sql文件,并在postgresql数据库上运行它们。每个.sql文件应该做的最后一件事是更新特定表中的版本号

例如,考虑以下文件列表:

 file1.sql
 file2.sql
文件按降序运行。file2,然后file1每个文件中的sql看起来类似于:

\c widgets;

DO $$
BEGIN  -- anonymous function starts
--      BEGIN -- start transaction 
        IF EXISTS (SELECT 1 FROM tablex) THEN

        -- do a bunch of stuff to the database. 
        -- update version number
        UPDATE widgets_control SET version = '1';

        END IF;
        --COMMIT;
END
$$;
文件2将首先运行。。。并将版本更新为2,文件1将更新为1,以此类推

问题

当我单独/手动运行这些文件时,每个文件都会正确设置版本号。 当我通过测试脚本运行它们时,文件1没有更新版本号。但会应用file1.sql中的其他sql语句

测试脚本代码

尝试循环并运行所有.sql文件的代码如下所示:lua代码

  for index, value in ipairs (sql_change_files) do
       os.execute('psql -U postgres -f '..value)
       --os.execute('sleep 10')
  end
问题: 我是否正确地声明了DO块?我添加DO是因为我想使用IF-EXISTS语句

我是否正确创建了事务?正如你所看到的,我在玩BEGIN/COMMIT

如果事务设置正确,我想不出为什么背靠背运行这两个文件会失败。正如你所看到的,我还使用了sleep命令。。。看看这是否是某种种族状况


任何提示都将不胜感激。

与问题无关:但if似乎毫无用处。只要运行更新,如果表中没有行,那么什么也得不到updated@a_horse_with_no_name为了简单起见,我没有进入如果。。。但这是必需的。更新widgets\u控制集version='1',如果存在,请从tablex中选择1;如果file2更新了相同的版本行,那么您将看不到版本1。抱歉@joop我不理解您的评论。更新只应在IF和更新之间的其他语句运行后发生。。。