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

Hom*_*lli 29 postgresql bash 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
Run Code Online (Sandbox Code Playgroud)

我希望能够编写一个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
Run Code Online (Sandbox Code Playgroud)

有关如何做到这一点的任何建议?(你可能已经猜到了,我是一个shell脚本新手.)

编辑

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

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

Erw*_*ter 46

首先,千万不能psql元命令和SQL命令.这些是单独的命令集.有些技巧可以将它们组合起来(使用psql元命令\o\\管道字符串到shell中的psql),但如果可以的话,请远离它.

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

我假设您作为系统用户运行,postgres并且您拥有postgresPostgres超级用户.默认端口5432上的同一数据库集群中的所有数据库和用户postgres由于IDENT设置pg_hba.conf(默认设置)而具有无密码访问权限.

psql postgres -c "CREATE DATABASE mytemplate1 WITH ENCODING 'UTF8'
                  TEMPLATE template0"
Run Code Online (Sandbox Code Playgroud)

我将新模板db基于系统模板db template0.在这里阅读更多相关信息.
你的问题:

如何(...)从文件中运行一组pgsql cmds

尝试:

psql mytemplate1 -f file
Run Code Online (Sandbox Code Playgroud)

批量示例:

#! /bin/sh

for file in /path/to/files/*; do
    psql mytemplate1 -f "$file"
done
Run Code Online (Sandbox Code Playgroud)

命令选项-f使得psql在文件中执行SQL命令.

如何在命令行上基于现有模板创建数据库

psql -c 'CREATE DATABASE myDB TEMPLATE mytemplate1'
Run Code Online (Sandbox Code Playgroud)

命令选项-c使psql执行单个SQL命令字符串.可以是多个命令,终止于;- 将在一个事务中执行,并且只返回最后一个命令的结果.
阅读手册中的psql命令选项.

如果未提供要连接的数据库,psql则将使用名为的默认维护数据库postgres.在第二个答案中,与我们连接的数据库无关.