首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >用于在文件中执行pgsql命令的Shell脚本

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

Stack Overflow用户
提问于 2011-12-22 02:41:26
回答 5查看 99K关注 0票数 45

我正在尝试自动化一组创建模板数据库的过程。

我有一组文件(file1、file2、...fileN),每个文件都包含创建模板数据库所需的一组pgsql命令。

文件(createdbtemplate1.sql)的内容大致如下:

代码语言:javascript
复制
CREATE DATABASE mytemplate1 WITH ENCODING 'UTF8';

\c mytemplate1

CREATE TABLE first_table ( 
 --- fields here ..
);

-- Add C language extension + functions
\i db_funcs.sql

我希望能够编写一个shell脚本来执行文件中的命令,这样我就可以编写这样的脚本:

代码语言:javascript
复制
# 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 cmd的bash脚本)
  2. 如何在命令行中基于现有模板创建数据库
EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2011-12-22 04:00:39

首先,不要将psql元命令和SQL命令混合在一起。这些是单独的命令集。有一些技巧可以将它们组合在一起(使用psql元命令psql和\\,并在\o中通过管道将字符串传递给psql),但这很快就会让人感到困惑。

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

假设您以操作系统用户postgres身份操作,并以(默认) Postgres超级用户身份使用DB角色postgres,则所有数据库都位于默认端口5432上的同一DB集群中,并且角色postgres具有无密码访问权限,这是由于pg_hba.conf中的IDENT设置(默认设置)。

代码语言:javascript
复制
psql postgres -c "CREATE DATABASE mytemplate1 WITH ENCODING 'UTF8'
                  TEMPLATE template0"

我基于默认的系统模板数据库template0创建了新的模板数据库。Basics in the manual here.

您的问题

How to (...)从文件运行一组pgsql cmd

尝试:

代码语言:javascript
复制
psql mytemplate1 -f file

目录中批量文件的示例脚本文件:

代码语言:javascript
复制
#! /bin/sh

for file in /path/to/files/*; do
    psql mytemplate1 -f "$file"
done

命令选项SQL让psql在文件中执行-f命令。

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

代码语言:javascript
复制
psql -c 'CREATE DATABASE my_db TEMPLATE mytemplate1'

命令选项SQL让psql执行单个-c命令字符串。可以是多个命令,由;终止-将在一个事务中执行,并且只返回最后一个命令的结果。

阅读有关psql command options in the manual的信息。

如果您不提供要连接的数据库,psql将连接到名为"postgres“的默认维护数据库。在第二个答案中,我们连接到哪个数据库并不重要。

票数 59
EN

Stack Overflow用户

发布于 2011-12-22 02:59:08

您可以将命令echo到psql输入:

代码语言:javascript
复制
for dbname in foo foofoo foobar barbar
do
    echo """
CREATE DATABASE $dbname TEMPLATE mytemplate1
""" | psql
done
票数 3
EN

Stack Overflow用户

发布于 2011-12-22 03:10:00

如果你愿意走得更远,你可能会用sqlalchemy取得更大的成功。它将允许您使用python而不是bash来构建脚本,后者更容易,并且有更好的控制。

根据评论中的要求:https://github.com/srathbun/sqlCmd

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8594717

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档