我需要一些建议来创建一个脚本来帮助我完成我在开发环境中一直执行的重复性任务。我有一台 PostgreSQL 服务器,由于我正在开发一个 Web 应用程序,所以我需要一直删除、创建和填充一些表,这是一个繁琐的过程。所以我需要构建某种 bash 脚本来帮助我解决这个问题。基本上,这是我从 pgAdmin GUI 中一直执行的重复性任务:
#!/bin/sh
psql -u postgres -w // this line should connect to PostgreSQL asking for a password since I not found other way to pass the password on that line
DROP DATABASE sis_db; // drop the DB
CREATE DATABASE sis_db WITH OWNER = postgres ENCODING = 'UTF8' TABLESPACE = pg_default LC_COLLATE = 'en_US.UTF-8' LC_CTYPE = 'en_US.UTF-8' CONNECTION LIMIT = -1; // create the DB
// Create some schemas on the DB ( I don't know if I should select the DB first)
CREATE SCHEMA nomencladores AUTHORIZATION postgres;
CREATE SCHEMA negocio AUTHORIZATION postgres;
CREATE SCHEMA usuarios_externos AUTHORIZATION postgres;
最后我应该加载大约 10 个.sql
文件,但不知道是否-filename
允许同时加载多个文件。我需要一些关于这个 bash 脚本的建议,因为我不知道如何获取它,有人能给我一些帮助吗?
更新:第一个脚本方法
好的,通过深入研究,我找到了这个可行的解决方案,但也缺少一些我需要的东西。我写了这个脚本:
#!/bin/sh
# kill all connections to the postgres server
echo "SELECT pg_terminate_backend(pg_stat_activity.pid) FROM pg_stat_activity where pg_stat_activity.datname='sis_db';" | psql -U postgres -w
# drop the DB
echo "DROP DATABASE sis_db;" | psql -U postgres -w
# create the DB
echo "CREATE DATABASE sis_db WITH OWNER = postgres ENCODING = 'UTF8' TABLESPACE = pg_default LC_COLLATE = 'en_US.UTF-8' LC_CTYPE = 'en_US.UTF-8' CONNECTION LIMIT = -1;" | psql -U postgres -w
# create schemas
echo "CREATE SCHEMA nomencladores AUTHORIZATION postgres;" | psql -U postgres -d sis_db -w
echo "CREATE SCHEMA negocio AUTHORIZATION postgres;" | psql -U postgres -d sis_db -w
echo "CREATE SCHEMA usuarios_externos AUTHORIZATION postgres;" | psql -U postgres -d sis_db -w
它将使用/root/.pgpass
我创建并配置的文件。脚本现在按我想要的方式运行,但我不知道如何同时添加多个文件,例如,在创建架构后执行的内容sql1.sql
,sql2.sql
等等,有什么帮助或建议吗?
答案1
这是一个可以在 Bash 脚本中直接使用的骨架:
#!/bin/sh
psql -U postgres << END_OF_SCRIPT
DROP DATABASE sis_db; -- drop the DB
CREATE DATABASE sis_db WITH OWNER = postgres ENCODING = 'UTF8' TABLESPACE = pg_default LC_COLLATE = 'en_US.UTF-8' LC_CTYPE = 'en_US.UTF-8' CONNECTION LIMIT = -1;
\c sis_db
-- Create some schemas on the DB
CREATE SCHEMA nomencladores AUTHORIZATION postgres;
CREATE SCHEMA negocio AUTHORIZATION postgres;
CREATE SCHEMA usuarios_externos AUTHORIZATION postgres;
END_OF_SCRIPT
一些评论:
-u
不起作用,它的-U
选项区分大小写。CREATE DATABASE
不会自动连接到新数据库,\c sis_db
但这是稍后在脚本中创建的对象属于该数据库的唯一方法。--
在 SQL 中,行尾注释以 开头,而不是//
该
--file
选项不能在命令行上多次使用,只有最后一个选项会被接受。但是,\i fileN.sql
从内部psql
可以使用来包含一系列文件。小心错误。默认情况下,脚本会在错误后继续,这可能会产生不良影响,例如在错误的数据库中创建对象。这可以通过
-vON_ERROR_STOP=1
psql 的命令行或\set ON_ERROR_STOP on
脚本内部来避免。检查 psql手册页,它解释了这一切以及更多。