我正在尝试自动化一组创建模板数据库的过程。
我有一组文件(file1、file2、...fileN),每个文件都包含创建 TEMPLATE 数据库所需的一组 pgsql 命令。
文件(创建的 template1.sql)的内容大致如下:
CREATE DATABASE mytemplate1 WITH ENCODING 'UTF8';
\c mytemplate1
CREATE TABLE first_table (
--- fields here ..
);
-- Add C language extension + functions
\i db_funcs.sql
我希望能够编写一个 shell 脚本来执行文件中的命令,这样我就可以编写如下脚本:
# run commands to create TEMPLATE db mytemplate1
# ./groksqlcommands.sh createdbtemplate1.sql
for dbname in foo foofoo foobar barbar
do
# Need to simply create a database based on an existing template in this script
psql CREATE DATABASE $dbname TEMPLATE mytemplate1
done
关于如何执行此操作有什么建议吗? (您可能已经猜到了,我是 shell 脚本新手。)
Edit
为了进一步澄清这个问题,我想知道:
- 如何编写 groksqlcommands.sh (一个将从文件运行一组 pgsql cmd 的 bash 脚本)
- 如何在命令行基于现有模板创建数据库
首先,做not mix psql
元命令和SQL
命令。这些是单独的命令集。有一些技巧可以将它们结合起来(使用 psql 元命令\o
and \\
并在 shell 中通过管道将字符串传递给 psql),但这很快就会变得令人困惑。
- 使您的文件仅包含 SQL 命令。
- 不包括
CREATE DATABASE
SQL 文件中的语句。单独创建数据库,你有multiple您想要在同一模板数据库中执行的文件。
Assuming您正在以操作系统用户身份操作postgres
并使用数据库角色postgres
作为(默认)Postgres 超级用户,所有数据库都位于默认端口 5432 和角色上的同一数据库集群中postgres
由于以下原因可以进行无密码访问IDENT
设置在pg_hba.conf
- 默认设置。
psql postgres -c "CREATE DATABASE mytemplate1 WITH ENCODING 'UTF8'
TEMPLATE template0"
我基于默认的系统模板数据库创建了新的模板数据库template0
. 手册中的基础知识在这里。 https://www.postgresql.org/docs/current/sql-createdatabase.html
你的问题
如何(...)从文件运行一组 postgresql 命令
Try:
psql mytemplate1 -f file
目录中批量文件的示例脚本文件:
#! /bin/sh
for file in /path/to/files/*; do
psql mytemplate1 -f "$file"
done
命令选项-f
makes psql
执行文件中的 SQL 命令。
如何在命令行基于现有模板创建数据库
psql -c 'CREATE DATABASE my_db TEMPLATE mytemplate1'
命令选项-c
makes psql
执行单个 SQL 命令字符串。可以是多个命令,终止于;
- 将在执行one事务并且仅返回最后一个命令的结果。
阅读手册中的 psql 命令选项 https://www.postgresql.org/docs/current/app-psql.html.
如果您不提供要连接的数据库,psql
将连接到名为“postgres”的默认维护数据库。在第二个答案中,我们连接到哪个数据库无关紧要。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)