我有一个简短的Python脚本查询和Oracle数据库,并使用Pandas数据帧将结果保存到CSV。然后我尝试通过子进程调用调用SQL * Loader将csv文件导入另一个数据库。两个步骤都可以独立工作。但是,在同一个脚本中,子进程调用失败。
这是我的代码的截断副本:
import pandas as pd
import pandas.io.sql as psql
from sqlalchemy import create_engine
import subprocess
# Create database connections
cxnAspect = create_engine('oracle+cx_oracle://user:pass@TNS')
# Set control strings
filename = 'export.csv'
filepath = 'C:/temp/'
sqlldr = 'C:/Oracle/product/11.2.0/client_1/BIN/sqlldr'
dblogin = 'userid=user/pass@TNS'
ctlfile = 'control=C:/Temp/control.ctl'
datafile = 'data=C:/Temp/data.csv'
# Load query
sqlStr = """SELECT <snip>"""
# Load query result into dataframe
df = psql.read_sql_query(sqlStr, cxnAspect) #! If this line is removed, issue is resolved
# Write dataframe to CSV file
df.to_csv(filepath+filename, header = False, index=False)
# Load CSV file to database with SQL Loader
with open('stdout.txt', 'wb') as out:
with open('stderr.txt', 'wb') as err:
# subprocess.call([sqlldr, dblogin, ctlfile, datafile, stdout=out, stderr=err)
运行查询,保存到csv并调用子进程是一个相当简单的过程。查询没有问题并保存到csv。独立运行时,subprocess.call到SQL * Loader也能正常工作。 但是,在单个文件中查询后调用时,错误输出为:
Message 2100 not found; No message file for product=RDBMS, facility=ULMessage 2100 not found; No message file for product=RDBMS, facility=UL
这似乎意味着环境变量存在问题,但我无法将其与subprocess.call在独立脚本中正常工作的事实相协调。
为什么read_sql_query()会导致SQL * Loader失败?