создать файл из скрипта bash - PullRequest
0 голосов
/ 08 февраля 2020

Мне нужно создать файл. sql файл, в котором я хочу хранить некоторые операторы DDL.

Во-первых, он должен создать пользователя базы данных, схему и предоставить некоторые разрешения. Затем он должен сделать копии некоторых таблиц во вновь созданной схеме. Имена таблиц я держу в переменной bash. Количество таблиц в массиве может варьироваться.

Я не могу сделать один cat > file.sql < EOF ... EOF блок, чтобы сделать это, потому что мне нужно генерировать команды CREATE TABLE и ALTER TABLE .. зависит от количества таблиц ,

Я создал скрипт. sh с переменными и тремя bash функциями:

TABLES=( "table_one" "table_two" "table_three" "table_four" "table_five")
SOURCE_SCHEMA="src"
TARGET_SCHEMA="tgt"
FILE=file.sql
function create_prepare_sql_v1 {
   cat > $FILE << EOF_SQL_V1

...here goes create user/schema and grant statements...

EOF_SQL_V1
function create_prepare_sql_v2 {
count=1
for table in ${!TABLES[@]}; do
        ( echo -e "CREATE TABLE $SOURCE_SCHEMA.${TABLES[$table]} AS TABLE $TARGET_SCHEMA.${TABLES[$table]};" \
        "\nALTER TABLE $SOURCE_SCHEMA.${TABLES[$table]} ADD PRIMARY KEY(id);" \
        "\nINSERT INTO $SOURCE_SCHEMA.temp VALUES ("$count", '"$TARGET_SCHEMA"', '"${TABLES[$table]}"');" ) >> $FILE
        ((count++))
done
function create_prepare_sql_v3 {
   cat >> $FILE << 'EOF_SQL_V3'

...here I put my custom PL/pgSQL functions...

EOF_SQL_V3

Когда я выполняю функции и проверяю этот файл. sql содержит все предыдущие данные, добавляя и удаляя строки шага # _done. Когда все сделано, я удаляю строку step_3_done.

Это работает, но кажется, что это очень слабое решение.

create_prepare_sql_v1 && echo "step1_done" >> $FILE || exit 1
create_prepare_sql_v2 && sed -i 's/step1_done/step2_done/' $FILE || exit 1
create_prepare_sql_v3 && sed -i 's/step2_done/step3_done/' $FILE || exit 1


if ! fgrep -q 'step3_done' $FILE ; then
        echo "Something went wrong. Exiting.."
        exit 1
fi

sed -i '/step3_done/d' $FILE
echo "All good."

После генерации файла. sql должен выглядеть примерно так:

\connect dbname
CREATE USER u_user WITH PASSWORD 'blah';
CREATE SCHEMA IF NOT EXISTS src AUTHORIZATION u_user;
GRANT USAGE ON SCHEMA src TO u_user;

CREATE TABLE src.temp (
    id INTEGER PRIMARY KEY,
    schema_name VARCHAR(100),
    table_name VARCHAR(100),
    truncated BOOLEAN DEFAULT false
);

CREATE TABLE src.table_one AS TABLE tgt.table_one;
ALTER TABLE src.table_one ADD PRIMARY KEY(id);
INSERT INTO src.temp VALUES (1, 'tgt', 'table_one');

CREATE TABLE src.table_two AS TABLE tgt.table_two;
ALTER TABLE src.table_two ADD PRIMARY KEY(id);
INSERT INTO src.temp VALUES (2, 'tgt', 'table_two');

CREATE TABLE src.table_three AS TABLE tgt.table_three;
ALTER TABLE src.table_three ADD PRIMARY KEY(id);
INSERT INTO src.temp VALUES (3, 'tgt', 'table_three');
etc

CREATE OR REPLACE FUNCTION ..
CREATE OR REPLACE FUNCTION ..
CREATE OR REPLACE FUNCTION ..

Если бы это были только sql операторы с постоянным количеством таблиц, не было бы проблема сделать это с одним cat > $FILE << EOF <some_code> EOF блоком ...

Можете ли вы предложить лучшее решение? Спасибо!

...