postgresql文件未正确执行
背景 我有一个小程序,可以循环遍历一堆.sql文件,并在postgresql数据库上运行它们。每个.sql文件应该做的最后一件事是更新特定表中的版本号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
例如,考虑以下文件列表:
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和更新之间的其他语句运行后发生。。。