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

2024-03-17

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

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

文件(创建的 template1.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 脚本新手。)

Edit

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

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

首先,做not mix psql元命令和SQL命令。这些是单独的命令集。有一些技巧可以将它们结合起来(使用 psql 元命令\o and \\并在 shell 中通过管道将字符串传递给 psql),但这很快就会变得令人困惑。

  • 使您的文件仅包含 SQL 命令。
  • 不包括CREATE DATABASESQL 文件中的语句。单独创建数据库,你有multiple您想要在同一模板数据库中执行的文件。

Assuming您正在以操作系统用户身份操作postgres并使用数据库角色postgres作为(默认)Postgres 超级用户,所有数据库都位于默认端口 5432 和角色上的同一数据库集群中postgres由于以下原因可以进行无密码访问IDENT设置在pg_hba.conf- 默认设置。

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

我基于默认的系统模板数据库创建了新的模板数据库template0. 手册中的基础知识在这里。 https://www.postgresql.org/docs/current/sql-createdatabase.html

你的问题

如何(...)从文件运行一组 postgresql 命令

Try:

psql mytemplate1 -f file

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

#! /bin/sh

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

命令选项-f makes psql执行文件中的 SQL 命令。

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

psql -c 'CREATE DATABASE my_db TEMPLATE mytemplate1'

命令选项-c makes psql执行单个 SQL 命令字符串。可以是多个命令,终止于;- 将在执行one事务并且仅返回最后一个命令的结果。
阅读手册中的 psql 命令选项 https://www.postgresql.org/docs/current/app-psql.html.

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在文件中执行 pgsql 命令的 Shell 脚本 的相关文章

  • 将 PostgreSQL 中的 IP 地址转换为整数?

    有没有一个查询可以完成这个任务 例如 给定一个条目 216 55 82 34 我想用 分割字符串 并应用等式 IP 号 16777216 w 65536 x 256 y z 其中 IP 地址 w x y z 仅通过查询就可以实现这一点吗 您
  • Bash 脚本:#!/bin/bash 是什么意思? [复制]

    这个问题在这里已经有答案了 在 bash 脚本中 什么是 bin bash第一行是什么意思 UPDATE 有区别吗 bin bash and bin sh 这就是所谓的shebang http en wikipedia org wiki S
  • 带回调或异步/等待的节点 postgres 事务?

    我正在运行 Node 7 6 0 它支持 async await node postgres 客户端池支持 async await 并且有一个很好的示例here https github com brianc node pg pool pl
  • 将数组传递给函数名称冲突

    Specs GNU bash 版本 3 1 17 无法升级 Premise 我一直在摆弄数组 我想知道是否有任何方法可以让函数的本地变量与所述函数外部的数组同名 Example 在下面的示例中 我将尝试显示该问题 Working bin b
  • Postgres 运行缓慢的删除查询

    我们有一个表 其行数刚刚超过 62k 我们正在对其运行一个非常简单的删除查询 需要 45 分钟才能完成 DELETE FROM myTable WHERE createdtime lt 2017 03 07 05 00 00 000 我们尝
  • 伊迪德信息

    重新定义问题 有什么方法可以获取所连接显示器的序列号吗 我想收集显示器的Eid信息 当我使用 logverbose 选项运行 X 时 我可以从 xorg 0 log 文件中获取它 但问题是 如果我切换显示器 拔出当前显示器 然后插入另一个显
  • 如何将命令作为参数传递给 ssh [重复]

    这个问题在这里已经有答案了 我的需要是让这个命令起作用 sshpass p XXXX ssh oStrictHostKeyChecking no email protected cdn cgi l email protection sudo
  • 如何使 case 语句匹配数字范围?

    我正在运行一个列号范围为 0 50 的开关案例 现在每个案例都支持离散列号 我观察到它的失败 这是代码 i 10 a 1 b 0 65 if a b then case i in 1 2 5 echo Not OK 9 10 12 echo
  • Postgres 使用 Rails Active Record 在 IN 列表中 ORDER BY 值

    我收到按 收入 排序的 UserId 列表 一次大约 1000 个 我在 我的系统数据库 中有用户记录 但 收入 列不存在 我想从 我的系统数据库 中检索用户 按照列表中收到的排序顺序 我尝试使用 Active Record 执行以下操作
  • Inotify linux 监视子目录

    是否可以以这种模式监视目录 storage data usernames Download gt storage data Download 我需要监视每个用户的下载文件夹中是否进行了更改 也许我需要创建所有路径的列表 将其放入数组中 并在
  • POSIX SH 构建循环变量,其元素包含空格

    这是我需要的代码 bin sh x1 a1 a2 x2 b1 b2 list SOMETHING for x in list do echo x done 以及我想要的输出 a1 a2 b1 b2 问题是 应该做什么SOMETHING是 我
  • Postgres where 子句比较时间戳

    我有一个表 其中列的数据类型timestamp 其中包含一天的多条记录 我想选择与日期对应的所有行 我该怎么做 Assuming you actually mean timestamp because there is no datetim
  • bash 中的“declare -r”和“readonly”有什么区别?

    在 bash 中 有什么区别declare r and readonly declare r a a1 readonly b b1 我不知道该选择哪个 tl dr readonly使用默认范围global甚至在函数内部 declare使用范
  • PostgreSQL 如何创建数据库或模式的副本?

    有没有一种简单的方法可以在 PostgreSQL 8 1 中创建数据库或模式的副本 我正在测试一些软件 它对数据库中的特定模式进行大量更新 我想复制它 以便我可以与原始版本进行一些比较 如果它位于同一服务器上 则只需使用带有 TEMPLAT
  • Bash 方法的返回值总是模 256

    我有一个 bash 脚本方法 它返回输入值 然而 返回值始终是模 256 的值 我用 google 搜索了一段时间 发现this http www tldp org LDP abs html exitcodes html文章说它总是以 25
  • PostgreSQL:有效地将 JSON 数组拆分为行

    我有一个表 表 A 其中包含一个包含 JSON 编码数据的文本列 JSON 数据始终是一个包含一到几千个普通对象的数组 我有另一个表 表 B 其中有几列 包括数据类型为 JSON 的列 我想从表 A 中选择所有行 将 json 数组拆分为其
  • 按每月时间为用户标记标签

    数据源 User ID Visit Date 1 2020 01 01 12 29 15 1 2020 01 02 12 30 11 1 2020 04 01 12 31 01 2 2020 05 01 12 31 14 Problem 我
  • 如何将 bash 脚本的整个输出保存到文件

    我正在尝试将 bash 脚本的整个输出保存到文件中 我目前在代码开头有一个参数 ip 地址 如下所示 bin bash USAGE Usage 0
  • Bash 脚本大小限制?

    我有一个 bash 脚本 在 RHEL 或 OS X 上运行时出现以下错误 第 62484 行 意外标记 换行符 附近出现语法错误 第 62484 行 o gz 这是一个自动生成的脚本 用于解决我公司使用的 Grid Engine 计算集群
  • 提高 PostgreSQL 1 亿数据左连接查询性能

    我在用Postgresql 9 2 version Windows 7 64 bit RAM 6GB 这是一个Java企业项目 我必须在我的页面中显示订单相关信息 有三个表通过左连接连接在一起 Tables TV HD 389772 行 T

随机推荐