Shell-скрипт для выполнения команд pgsql в файлы

Я пытаюсь автоматизировать набор процедур, которые создают базы данных шаблонов.

у меня есть набор файлов (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

Я хочу иметь возможность написать сценарий оболочки, который будет выполнять команды в файле, так что я могу написать сценарий, как это:

# 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

какие-либо предложения о том, как это сделать? (Как вы, возможно, догадались, я новичок в сценарии оболочки.)

редактировать

чтобы уточнить вопрос дальше, я хочу знать:

  1. как писать groksqlcommands.sh (скрипт bash, который будет запускать набор pgsql cmds из файла)
  2. как создать базу данных на основе существующего шаблона в командной строке

4 ответов


во-первых, do не mix psql мета-команд и SQL команды. Это отдельные наборы команд. Есть трюки, чтобы объединить их (используя мета-команды psql \o и \ и трубопроводы строк в psql в оболочке), но держитесь подальше от этого, если сможете.

  • Сделайте ваши файлы содержать только команды SQL.
  • не включайте инструкцию CREATE DATABASE в файлы SQL. Создайте БД отдельно, у вас есть несколько файлы, которые вы хотите выполнить в том же шаблоне db.

я предполагаю, что вы работаете как пользователь системы postgres и postgres как суперпользователь Postgres. Все базы данных в одном кластере БД на порту по умолчанию 5432 и пользователь postgres имеет доступ без пароля из-за IDENT настройка в pg_hba.conf (настройки по умолчанию).

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

я основываю новый шаблон db на системном шаблоне db template0. Читать об этом подробнее вот!--37-->.
Ваш вопрос:

как (...) запустите набор pgsql cmds из файла

попробуй:

psql mytemplate1 -f file

пример для партии:

#! /bin/sh

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

команда option -f делает psql выполнение команд SQL в файле.

как создать базу данных на основе существующего шаблона в командной строке

psql -c 'CREATE DATABASE myDB TEMPLATE mytemplate1'

команда option -c делает psql выполните одну строку команды SQL. Может быть несколько команд, завершенных ; - будет исполнено в один транзакция и только результат последней возвращенной команды.
Читайте о параметры команды psql в руководстве.

если вы не предоставляете базу данных для подключения,psql будет использовать базу данных обслуживания по умолчанию с именем postgres. Во втором ответе не имеет значения, к какой базе данных мы подключаемся.


вы можете echo ваши команды для ввода psql:

for dbname in foo foofoo foobar barbar
do
    echo """
CREATE DATABASE $dbname TEMPLATE mytemplate1
""" | psql
done

Если вы готовы пройти лишнюю милю, у вас, вероятно, будет больше успеха с sqlalchemy. Это позволит вам создавать скрипты с python вместо bash, что проще и имеет лучший контроль.

Как запрошено в комментариях:https://github.com/srathbun/sqlCmd


храните сценарии sql под корневым каталогом Используйте dev, TST, PRD параметризованные dbs Используйте find для запуска всех скриптов pgsql, как показано здесь Выход на ошибки

или просто git клонировать весь инструмент из здесь