Как я могу сохранить тот же сеанс, используя подпроцесс в скрипте Pytest - PullRequest
0 голосов
/ 28 сентября 2018

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

@fixture(scope='session')
def tmp_dim_sponsor(get_redshift_connection):
    sql = """DROP TABLE IF EXISTS mock_tmp_dim_sponsor;
        CREATE TEMP TABLE mock_tmp_dim_sponsor (LIKE 
tmp.tmp_dim_sponsor);"""
    execute_sql_no_return(sql, get_redshift_connection, False)
    print("mock_tmp_dim_sponsor Created")

Затем у меня есть другой прибор, который вызывает скрипт bash с использованием подпроцесса.Эти bash-скрипты должны ссылаться на эти временные таблицы, которые были созданы ранее с помощью прибора.Сценарии bash устанавливают новое соединение с БД, а затем выполняют sql, который имеет ссылку на временные таблицы, созданные ранее.

@fixture(scope='session')
def dim_sponsor_transformation_1(get_redshift_connection):
    copy2('/dim_sponsor_transformation_test.sh', 
'/tmp_dim_sponsor_transformation.sh')
    with open("tmp_dim_sponsor_transformation.sh", "r+") as file1:
        with open("mock_dim_sponsor_transformation.sh", "w") as file2:
            for line in file1:
                new = re.sub(r'\$\{\w*SCHEMA\}\.', "mock_", line)
                new1 = re.sub(r'check_status \$\?.*', "", new)
                new2 = re.sub(r'>> \$LOGDIR.*', "", new1)
                new3 = re.sub(r'log .*"', "", new2)
                new4 = re.sub(r'SCRIPTDIR="\$HOME/scripts"', 
'SCRIPTDIR="/Users/abc/src/main/scripts"', new3)
                file2.write(new4)
            file.close(file1)
            file.close(file2)
            print(file2)
    os.chmod('mock_dim_sponsor_transformation.sh', 0o777)
    print("Changed the permission")
    print("Starting to Run the Transformation")
    t = 
subprocess.check_output(["./mock_dim_sponsor_transformation.sh", 
"qa"])
    print(t)
    print("Completed Transformation")

Сценарий bash (mock_dim_sponsor_transformation.sh) устанавливает новое соединение с БД, а затем выполняетSQL.

SCRIPTDIR="/User/xxx/xxx/src/main/scripts"
source $SCRIPTDIR/utils/get_environment.sh $1
export PGPASSWORD=$RSDBPASSWORD

PAST_DAY=$(date -d "yesterday" +"%Y-%m-%d")
PAST_DAY_VALUE="'"${PAST_DAY}"'"

psql -h $RSDBHOST -p $RSDBHOSTPORT -U $RSDBOWNER -d $RSDBNAME -c \
"
TRUNCATE mock_tmp_dim_sponsor;
" 

psql -h $RSDBHOST -p $RSDBHOSTPORT -U $RSDBOWNER -d $RSDBNAME -c \
"
INSERT INTO     mock_tmp_dim_sponsor
            (
            sponsor_legacy_id,
            sponsor_id,
            name,
            plan_type,
            default_segment_id,
            created_date,
            updated_date,
            is_genesis,
            sponsor_display_name,
             ...

Однако он не может найти те временные таблицы, которые, я думаю, имеет смысл b / c 1. Поскольку сценарий bash устанавливает новое соединение с БД, он не будет находить временные таблицы, поскольку временные таблицыв памяти об этой сессии.2. Создает ли подпроцесс новый сеанс при вызове другого сценария?

Какие-либо предложения о том, как я могу ссылаться на временные таблицы, созданные в fixture в сценарии bash?Кроме того, есть ли способ, которым я могу передать объект соединения db при вызове подпроцесса, чтобы mock_dim_sponsor_transformation.sh не устанавливал новое соединение?

Я довольно новичок в Pytest и все еще учусь.Любые предложения или рекомендации будут высоко оценены.Спасибо!

1 Ответ

0 голосов
/ 28 сентября 2018

Создает ли подпроцесс новый сеанс при вызове другого сценария?

Новый сеанс создается не subprocess.check_output(), а psql, вызываемым в сценарии bash.

Любые предложения о том, как я могу ссылаться на временные таблицы, созданные в приспособлении в скрипте bash?

Временные таблицы доступны только для того же соединения / транзакции,поэтому единственный способ использовать их - запускать команды SQL внутри основного процесса без каких-либо подпроцессов (сценариев оболочки).

Или сделать эти таблицы постоянными и удалить их самостоятельно после сценария оболочки.

Кроме того, есть ли способ передать объект соединения db в подпроцесс?

Нет, пути нет.

...