Подтвердить что ты не робот

Shell script для выполнения команд pgsql в файлах

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

У меня есть набор файлов (file1, file2,... fileN), каждый из которых содержит набор команд pgsql, необходимых для создания базы данных TEMPLATE.

Содержимое файла (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

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

# 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

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

Изменить

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

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

Ответ 1

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

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

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

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

Я основываю новый шаблон db на системном шаблоне db template0. Подробнее читайте здесь.
Ваш вопрос:

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

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

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

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

Ответ 2

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

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

Ответ 3

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

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

Ответ 4

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

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