我正在编写一个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相当陌生,仍然在学习。任何建议或指导将不胜感激。谢谢!
答案 0 :(得分:0)
子进程在调用另一个脚本时是否创建新会话?
不是由subprocess.check_output()
创建的新会话,而是由bash脚本中调用的psql
创建的。
关于如何能够在bash脚本中引用在夹具中创建的临时表的任何建议?
临时表仅可用于相同的连接/事务,因此使用它们的唯一方法是在主进程内运行SQL命令,而无需任何子进程(shell脚本)。
或者使这些表成为永久表,然后将它们自己放在shell脚本之后。
还有,我可以在子进程中传递数据库连接对象吗?
没有,没有办法。