Мне нужен совет по созданию сценария, чтобы помочь мне с повторяющимися задачами, которые я все время выполняю в среде разработки. У меня есть сервер PostgreSQL, и так как я разрабатываю веб-приложение, мне нужно все время отбрасывать, создавать и заполнять некоторые таблицы, и это утомительный процесс. Поэтому мне нужно создать какой-нибудь скрипт bash, чтобы помочь мне в этом. В основном это повторяющиеся задачи, которые я выполняю все время из графического интерфейса pgAdmin:

#!/bin/sh
psql -u postgres -w  // this line should connect to PostgreSQL asking for a password since I not found other way to pass the password on that line

DROP DATABASE sis_db; // drop the DB

CREATE DATABASE sis_db WITH OWNER = postgres ENCODING = 'UTF8' TABLESPACE = pg_default LC_COLLATE = 'en_US.UTF-8' LC_CTYPE = 'en_US.UTF-8' CONNECTION LIMIT = -1; // create the DB

// Create some schemas on the DB ( I don't know if I should select the DB first)
CREATE SCHEMA nomencladores AUTHORIZATION postgres;
CREATE SCHEMA negocio AUTHORIZATION postgres;
CREATE SCHEMA usuarios_externos AUTHORIZATION postgres;

И, наконец, я должен загрузить около 10 файлов .sql но не знаю, разрешает ли -filename более одного файла одновременно. Мне нужен совет по поводу этого сценария bash, так как я не знаю, как его получить, кто-нибудь может мне помочь?

Обновление: первый подход сценария

Хорошо, проведя глубокое исследование, я пришел с этим решением, которое работает, но скучаю по некоторым вещам, которые мне тоже нужны. Я сделал этот скрипт:

#!/bin/sh

# kill all connections to the postgres server
echo "SELECT pg_terminate_backend(pg_stat_activity.pid) FROM pg_stat_activity where pg_stat_activity.datname='sis_db';" | psql -U postgres -w

# drop the DB
echo "DROP DATABASE sis_db;" | psql -U postgres -w

# create the DB
echo "CREATE DATABASE sis_db WITH OWNER = postgres ENCODING = 'UTF8' TABLESPACE = pg_default LC_COLLATE = 'en_US.UTF-8' LC_CTYPE = 'en_US.UTF-8' CONNECTION LIMIT = -1;" | psql -U postgres -w

# create schemas
echo "CREATE SCHEMA nomencladores AUTHORIZATION postgres;" | psql -U postgres -d sis_db -w
echo "CREATE SCHEMA negocio AUTHORIZATION postgres;" | psql -U postgres -d sis_db -w
echo "CREATE SCHEMA usuarios_externos AUTHORIZATION postgres;" | psql -U postgres -d sis_db -w

Он будет использовать файл /root/.pgpass который я создал и настроил. Сценарий сейчас работает так, как я хочу, но я не знаю, как добавить несколько файлов одновременно, например, после создания схем выполнить содержимое sql1.sql , sql2.sql и т.д., Любой помощь или совет?

1 ответ1

1

Вот скелет, который можно использовать непосредственно в скрипте bash:

#!/bin/sh
psql -U postgres << END_OF_SCRIPT

DROP DATABASE sis_db; -- drop the DB

CREATE DATABASE sis_db WITH OWNER = postgres ENCODING = 'UTF8' TABLESPACE = pg_default LC_COLLATE = 'en_US.UTF-8' LC_CTYPE = 'en_US.UTF-8' CONNECTION LIMIT = -1;

\c sis_db

-- Create some schemas on the DB

CREATE SCHEMA nomencladores AUTHORIZATION postgres;
CREATE SCHEMA negocio AUTHORIZATION postgres;
CREATE SCHEMA usuarios_externos AUTHORIZATION postgres;

END_OF_SCRIPT

Несколько комментариев:

  • -u не будет работать, это -U , параметры чувствительны к регистру.

  • CREATE DATABASE не подключается автоматически к новой базе данных, \c sis_db делает и является единственным способом для объектов, созданных позже в сценарии, принадлежать этой базе данных.

  • комментарии в конце строки начинаются с -- в SQL, а не //

  • Опция --file не может использоваться несколько раз в командной строке, будет учитываться только последняя. Однако \i fileN.sql изнутри psql может использоваться для включения ряда файлов.

  • будьте осторожны с ошибками. По умолчанию сценарий будет продолжен после ошибки, что может привести к нежелательным последствиям, таким как создание объектов в неправильной базе данных. Этого можно избежать с помощью -vON_ERROR_STOP=1 в командной строке psql или \set ON_ERROR_STOP on изнутри скрипта.

  • Проверьте man-страницу psql, она объясняет все это и многое другое.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .