使用 PostgreSQL 和 bash 在单个事务中执行多个 .sql 文件
Execute several .sql files in a single transaction using PostgreSQL and bash
假设我有文件:
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;
这也失败了,因为 'begin' 命令仅在连接终止时执行。
是否可以使用 PostgreSQL 和 bash 在单个事务中执行多个 .sql 文件?
编辑:
每个文件的大致结构相似:
SET CLIENT_ENCODING TO 'WIN1251';
\i file4.sql
\i file5.sql
<etc>
RESET CLIENT_ENCODING;
我会为启动创建新文件(开始事务、设置编码等)并完成(提交)。
然后 运行 类似于:
cat startup.sql file*.sql finish.sql | psql dbname
要么用子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,因此文件*sql 将不会 展开。 Shell-变量将被扩展,即使在引号内也是如此。
您还可以使用 -1
或 --single-transaction
选项在事务中执行所有脚本:
cat file*.sql | psql -1
仅供参考,对于 Windows 命令行:
FOR /F "usebackq" %A IN (`dir *.sql /b/a-d`) DO psql -f %A
假设我有文件:
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;
这也失败了,因为 'begin' 命令仅在连接终止时执行。
是否可以使用 PostgreSQL 和 bash 在单个事务中执行多个 .sql 文件?
编辑:
每个文件的大致结构相似:
SET CLIENT_ENCODING TO 'WIN1251';
\i file4.sql
\i file5.sql
<etc>
RESET CLIENT_ENCODING;
我会为启动创建新文件(开始事务、设置编码等)并完成(提交)。
然后 运行 类似于:
cat startup.sql file*.sql finish.sql | psql dbname
要么用子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,因此文件*sql 将不会 展开。 Shell-变量将被扩展,即使在引号内也是如此。
您还可以使用 -1
或 --single-transaction
选项在事务中执行所有脚本:
cat file*.sql | psql -1
仅供参考,对于 Windows 命令行:
FOR /F "usebackq" %A IN (`dir *.sql /b/a-d`) DO psql -f %A