我正在尝试自动化一组创建模板数据库的过程。
我有一组文件(file1、file2、...fileN),每个文件都包含创建模板数据库所需的一组pgsql命令。
文件(createdbtemplate1.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脚本新手。)
编辑
为了进一步澄清这个问题,我想知道:
发布于 2011-12-22 04:00:39
首先,不要将psql
元命令和SQL
命令混合在一起。这些是单独的命令集。有一些技巧可以将它们组合在一起(使用psql元命令psql和\\
,并在\o
中通过管道将字符串传递给psql),但这很快就会让人感到困惑。
CREATE DATABASE
语句。单独创建数据库,因为您要在同一模板数据库中执行多个文件。假设您以操作系统用户postgres
身份操作,并以(默认) Postgres超级用户身份使用DB角色postgres
,则所有数据库都位于默认端口5432上的同一DB集群中,并且角色postgres
具有无密码访问权限,这是由于pg_hba.conf
中的IDENT
设置(默认设置)。
psql postgres -c "CREATE DATABASE mytemplate1 WITH ENCODING 'UTF8'
TEMPLATE template0"
我基于默认的系统模板数据库template0
创建了新的模板数据库。Basics in the manual here.
您的问题
How to (...)从文件运行一组pgsql cmd
尝试:
psql mytemplate1 -f file
目录中批量文件的示例脚本文件:
#! /bin/sh
for file in /path/to/files/*; do
psql mytemplate1 -f "$file"
done
命令选项SQL让psql
在文件中执行-f
命令。
如何在命令行中基于现有模板创建数据库
psql -c 'CREATE DATABASE my_db TEMPLATE mytemplate1'
命令选项SQL让psql
执行单个-c
命令字符串。可以是多个命令,由;
终止-将在一个事务中执行,并且只返回最后一个命令的结果。
阅读有关psql command options in the manual的信息。
如果您不提供要连接的数据库,psql
将连接到名为"postgres“的默认维护数据库。在第二个答案中,我们连接到哪个数据库并不重要。
发布于 2011-12-22 02:59:08
您可以将命令echo
到psql输入:
for dbname in foo foofoo foobar barbar
do
echo """
CREATE DATABASE $dbname TEMPLATE mytemplate1
""" | psql
done
发布于 2011-12-22 03:10:00
如果你愿意走得更远,你可能会用sqlalchemy取得更大的成功。它将允许您使用python而不是bash来构建脚本,后者更容易,并且有更好的控制。
根据评论中的要求:https://github.com/srathbun/sqlCmd
https://stackoverflow.com/questions/8594717
复制相似问题