我正在尝试自动创建一组创建TEMPLATE数据库的过程。
我有一组文件(file1,file2,... fileN),每个文件都包含一组创建TEMPLATE数据库所需的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脚本新手。)
为了进一步澄清这个问题,我想知道:
答案 0 :(得分:43)
首先,执行不混合psql
元命令和SQL
命令。这些是单独的命令集。有些技巧可以将它们组合起来(使用psql元命令\o
和\\
并将字符串传递给shell中的psql),但如果可以的话,请远离它。
我假设您作为系统用户postgres
运行,并且您拥有postgres
作为Postgres超级用户。由于postgres
中的IDENT
设置(默认设置),默认端口5432上的同一数据库群集中的所有数据库和用户pg_hba.conf
都具有无密码访问权限。
psql postgres -c "CREATE DATABASE mytemplate1 WITH ENCODING 'UTF8'
TEMPLATE template0"
我将新模板db建立在系统模板db template0
上。阅读more about that here。
你的问题:
如何(...)从文件
运行一组pgsql cmds
尝试:
psql mytemplate1 -f file
批次示例:
#! /bin/sh
for file in /path/to/files/*; do
psql mytemplate1 -f "$file"
done
命令选项-f
使psql
在文件中执行SQL命令。
如何在命令行基于现有模板创建数据库
psql -c 'CREATE DATABASE myDB TEMPLATE mytemplate1'
命令选项-c
使psql
执行单个SQL命令字符串。可以是由;
终止的多个命令 - 将在一个事务中执行,并且只返回最后一个命令的结果。
阅读psql command options in the manual。
如果您未提供要连接的数据库,psql
将使用名为postgres
的默认维护数据库。在第二个答案中,与我们连接的数据库无关。
答案 1 :(得分:3)
你可以echo
你的psql输入命令:
for dbname in foo foofoo foobar barbar
do
echo """
CREATE DATABASE $dbname TEMPLATE mytemplate1
""" | psql
done
答案 2 :(得分:1)
如果您愿意加倍努力,sqlalchemy可能会取得更大的成功。它将允许您使用python而不是bash构建脚本,这更容易并且具有更好的控制。
根据评论中的要求:https://github.com/srathbun/sqlCmd
答案 3 :(得分:0)
答案 4 :(得分:0)
对于该用例,您必须这样做。...
这是我用于将JSON导入PostgreSQL(WSL Ubuntu)的脚本,它基本上要求您在同一命令行中混合使用psql meta命令和SQL。请注意使用有点晦涩的脚本命令,该命令分配了一个伪tty:
$ more update.sh
#!/bin/bash
wget <filename>.json
echo '\set content `cat $(ls -t <redacted>.json.* | head -1)` \\ delete from <rable>; insert into <table> values(:'"'content'); refresh materialized view <view>; " | PGPASSWORD=<passwd> psql -h <host> -U <user> -d <database>
$