连接到 PgSQL,删除现有的数据库,使用 CREATE 重新创建它,然后单独运行一些查询以及使用 Bash 脚本从文件运行一些查询

连接到 PgSQL,删除现有的数据库,使用 CREATE 重新创建它,然后单独运行一些查询以及使用 Bash 脚本从文件运行一些查询

我需要一些建议来创建一个脚本来帮助我完成我在开发环境中一直执行的重复性任务。我有一台 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.sqlsql2.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=1psql 的命令行或\set ON_ERROR_STOP on脚本内部来避免。

  • 检查 psql手册页,它解释了这一切以及更多。

相关内容