我如何在Pytest脚本中使用子进程保持相同的会话

时间:2018-09-28 02:58:00

标签: python postgresql subprocess pytest

我正在编写一个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脚本需要引用这些先前使用Fixture创建的临时表。 bash脚本与db建立了新连接,然后执行引用了先前创建的临时表的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)与db建立新连接,然后执行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,
             ...

但是它找不到我认为合理的临时表 1.由于bash脚本正在与db建立新连接,因此它将找不到临时表,因为临时表已存储在该会话的内存中。 2.子进程在调用另一个脚本时是否创建新的会话?

关于如何能够引用bash脚本中的夹具中创建的临时表的任何建议? 另外,有没有一种方法可以在子进程调用中传递数据库连接对象,从而使mock_dim_sponsor_transformation.sh不会建立新的连接?

我对Pytest相当陌生,仍然在学习。任何建议或指导将不胜感激。谢谢!

1 个答案:

答案 0 :(得分:0)

  

子进程在调用另一个脚本时是否创建新会话?

不是由subprocess.check_output()创建的新会话,而是由bash脚本中调用的psql创建的。

  

关于如何能够在bash脚本中引用在夹具中创建的临时表的任何建议?

临时表仅可用于相同的连接/事务,因此使用它们的唯一方法是在主进程内运行SQL命令,而无需任何子进程(shell脚本)。

或者使这些表成为永久表,然后将它们自己放在shell脚本之后。

  

还有,我可以在子进程中传递数据库连接对象吗?

没有,没有办法。