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
какие-либо предложения о том, как это сделать? (Как вы, возможно, догадались, я новичок в сценарии оболочки.)
редактировать
чтобы уточнить вопрос дальше, я хочу знать:
- как писать groksqlcommands.sh (скрипт bash, который будет запускать набор pgsql cmds из файла)
- как создать базу данных на основе существующего шаблона в командной строке
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