我正在try 自动化一组创建模板数据库的过程.

我有一组文件(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脚本新手.)

编辑

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

  1. 如何编写groksql命令.将从一组CMD运行SQL脚本
  2. 如何在命令行中基于现有模板创建数据库

推荐答案

首先,混合使用psql个元命令和SQL个命令.这些是独立的命令集.有一些技巧可以将它们结合起来(使用psql元命令\o\\,并在shell中将字符串管道化到psql),但这很快就会让人困惑.

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

Assuming您以OS用户postgres的身份操作,并使用DB角色postgres作为(默认)Postgres超级用户,所有数据库都位于默认端口5432上的同一个DB集群中,并且由于pg_hba.conf中的IDENT设置,角色postgres具有较少的密码访问权限-默认设置.

psql postgres -c "CREATE DATABASE mytemplate1 WITH ENCODING 'UTF8'
                  TEMPLATE template0"

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

你的问题

如何(…)从文件运行一组pgsql CMD

try :

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 my_db TEMPLATE mytemplate1'

The command option -c makes psql execute a single SQL command string. Can be multiple commands, terminated by ; - will be executed in one transaction and only the result of the last command returned.
Read about psql command options in the manual.

如果您不提供要连接的数据库,psql将连接到名为"postgres"的默认维护数据库.第二个答案与我们连接到哪个数据库无关.

Postgresql相关问答推荐

Postgres将唯一索引添加到已在分区上具有PK的分区表中,然后添加PK

在Ubuntu 18.04 Bionic上安装PostgreSQL(已删除回购)

SQLX::Query!带有UUID::UUID的宏在Rust中编译失败

在Axum 0.5中,如何在一个请求处理程序中同时使用数据库和路径解析?

PostgreSQL:动态SELECT查询

使用 pgx 扫描范围类型

如何使用 go-pg 包删除所有记录

JOOQ:数据库版本早于 COCKROACHDB 支持的方言:13.0.0

当参数大小超过 393166 个字符时,PSQL 准备语句查询挂起

如何在 kubernetes 中安全地重启 postgresql 容器?

Upper() 不会大写重音字符

如何在 postgresql 上使用 sqlalchemy 进行正确的 upsert?

我可以在 Ruby on Rails 上编写 PostgreSQL 函数吗?

PostgreSQL ORDER BY 问题 - 自然排序

如何判断每个组中是否存在值

如何将主键添加到视图?

如何使用 Django Migrations 重新创建已删除的表?

错误:表tablename上的更新或删除违反外键约束

如何使用 PostgreSQL 触发器来存储更改(SQL 语句和行更改)

Capistrano 与 PostgreSQL,错误:database is being accessed by other users