如何在每个Postgres模式上运行脚本

时间:2020-03-31 08:15:33

标签: postgresql shell psql

我有一个Shell脚本,该脚本可迭代一个文件夹并在给定数据库上执行该文件夹中的所有sql脚本。以下是我传递给该脚本的参数

database.sh -h hostname -p port -U user -d database -P password

我想修改此脚本以支持更新多个架构。该文件夹中存在的所有脚本都应在所有架构上运行。我可以使用查询

获取所有架构
SELECT nspname 
FROM pg_catalog.pg_namespace 
WHERE nspname !~ '^pg_' 
AND nspname not in  ('information_schema','public');

如何使用Shell脚本实现这一目标,或者你们可以建议其他方法。

1 个答案:

答案 0 :(得分:0)

生成具有以下内容的架构列表:

$ cat gls.sql
\pset tuples_only on
SELECT nspname 
FROM pg_catalog.pg_namespace 
WHERE nspname !~ '^pg_' 
AND nspname not in  ('information_schema','public');

使用2个SQL脚本运行脚本:第一个更改search_path,并由在单个模式下工作的主SQL脚本调用:

$ cat test.sql
\i set_current_schema.sql
show search_path;
select * from t;

全局shell脚本:

psql -f gls.sql -q -o ls.txt
for s in $(cat ls.txt)
do
 echo "set search_path='"$s"';" > set_current_schema.sql
 psql -e -f test.sql
done
相关问题