用于在文件中执行pgsql命令的Shell脚本

时间:2011-12-21 18:41:26

标签: bash postgresql psql

我正在尝试自动创建一组创建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脚本新手。)

修改

为了进一步澄清这个问题,我想知道:

  1. 如何编写groksqlcommands.sh(一个将从文件运行一组pgsql cmds的bash脚本)
  2. 如何在命令行基于现有模板创建数据库

5 个答案:

答案 0 :(得分:43)

首先,执行混合psql元命令和SQL命令。这些是单独的命令集。有些技巧可以将它们组合起来(使用psql元命令\o\\并将字符串传递给shell中的psql),但如果可以的话,请远离它。

  • 使您的文件仅包含SQL命令。
  • 不要在SQL文件中包含CREATE DATABASE语句。单独创建数据库,您要在同一模板数据库中执行多个文件。

我假设您作为系统用户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)

将sql脚本存储在根目录下 使用dev,tst,prd参数化dbs 使用find运行所有pgsql脚本,如图所示here 退出错误

或者只是从here

克隆整个工具

答案 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>
$