【问题标题】:Execute several .sql files in a single transaction using PostgreSQL and bash使用 PostgreSQL 和 bash 在单个事务中执行多个 .sql 文件
【发布时间】:2019-06-30 03:27:22
【问题描述】:

假设我有文件:

file1.sql
file2.sql
file3.sql

我需要在一个事务中执行所有三个文件。我正在寻找一个 bash 脚本,例如:

psql -h hostname -U username dbname -c "
begin;
\i file1.sql
\i file2.sql
\i file3.sql
commit;"

这会失败并出现错误:Syntax error at or near "\"

我也试过先连接数据库,然后执行失败,像这样:

psql dbname
begin;
\i file1.sql
\i file2.sql
\i file3.sql
commit;

这也失败了,因为“开始”命令仅在连接终止时执行。

是否可以使用 PostgreSQL 和 bash 在单个事务中执行多个 .sql 文件?

编辑:

每个文件的大致结构都差不多:

SET CLIENT_ENCODING TO 'WIN1251';
\i file4.sql
\i file5.sql
<etc>
RESET CLIENT_ENCODING;

【问题讨论】:

  • 你可以构建一个文件来执行 cat 文件连同 printf begin+end around
  • @amdixon 是的,我可以,但每个文件还包含 \i 命令。所以结果是一样的。
  • 您是否控制(/正在生成)这些文件?
  • @amdixon 文件是自动生成的,我不管。
  • 子shell:(echo "BEGIN;"; cat file1.sql; cat file2.sql; ... echo "COMMIT;") | psql ... 或使用here-document。

标签: bash postgresql transactions


【解决方案1】:

您还可以使用-1--single-transaction 选项在事务中执行所有脚本:

cat file*.sql | psql -1

【讨论】:

    【解决方案2】:

    要么使用子shell:

    #!/bin/sh
     (echo "BEGIN;"; cat file1.sql; cat file2.sql; echo "COMMIT;") \
     | psql -U the_user the_database
    
    #eof
    

    或使用此处的文档:

    #!/bin/sh
    psql -U the_user the_database <<OMG
    BEGIN;
    
    \i file1.sql
    
    \i file2.sql
    
    COMMIT;
    OMG
    
    #eof
    

    注意:在 HERE 文档中不会有 globbing,因此 file*sql 将不会被扩展。 Shell 变量将被扩展,即使在引号内。

    【讨论】:

    • 是的,子外壳工作,因为管道。没想到将文件通过管道传输到 psql 中。感谢您的帮助。
    【解决方案3】:

    我会为启动创建新文件(开始事务、设置编码等)并完成(提交)。

    然后运行类似:

    cat startup.sql file*.sql finish.sql | psql dbname
    

    【讨论】:

    • 我使用了第一个解决方案,但估计这个也可以。
    【解决方案4】:

    仅供参考,对于 Windows 命令行:

    FOR /F "usebackq" %A IN (`dir *.sql /b/a-d`) DO psql -f %A
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-12-13
      • 2022-07-11
      • 2019-12-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-03-13
      • 2012-09-11
      相关资源
      最近更新 更多