使用PostgreSQL和bash在单个事务中执行几个.sql文件

时间:2015-07-21 10:59:26

标签: bash postgresql transactions

说我有文件:

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

我需要在一个事务中执行所有三个文件。我正在寻找像:

这样的bash脚本
Syntax error at or near "\"

此操作失败并显示错误:psql dbname begin; \i file1.sql \i file2.sql \i file3.sql commit;

我还尝试先连接到数据库,然后执行失败,如下所示:

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

这也失败了,因为'begin'命令仅在连接终止时执行。

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

修改

每个文件的粗略结构都是类似的:

                         set MYTIME = %%a
space included in variable name....^ ^.. Space included in value

4 个答案:

答案 0 :(得分:10)

使用子shell:

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

#eof

或使用here-document:

#!/bin/sh
psql -U the_user the_database <<OMG
BEGIN;

\i file1.sql

\i file2.sql

COMMIT;
OMG

#eof

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

答案 1 :(得分:7)

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

cat file*.sql | psql -1

答案 2 :(得分:4)

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

然后运行类似:

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

答案 3 :(得分:0)

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

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