[英]Using sqlldr in python subprocess.call() fails, but no information
我需要一些幫助。 我正在嘗試從python內部執行SQLLDR。 我發現最好的方法是使用subprocess.call。 在其他函數中使用參數,我在這段代碼中復制了它。 當我運行它時,我得到了預期的適當字段。 但是,該過程返回1,這是一個失敗。 我沒有其他信息,無法找到可能的問題。
我已經驗證了data.csv從BASH加載到我的表中,但是python沒有。
def load_raw():
DATA_FILE='data.csv'
CONTROL_FILE='raw_table.ctl'
LOG_FILE='logfile.log'
BAD_FILE='badfile.log'
DISCARD_FILE='discard.log'
connect_string = os.environ['CONNECT_STRING']
sqlldr_parms='rows=1000 readsize=50000 direct=true columnarrayrows=100 bindsize=500000 streamsize=500000 silent=(HEADER,FEEDBACK)'
parms = {}
parms['userid'] = connect_string
parms['sqlldr'] = sqlldr_parms
parms['data'] = DATA_FILE
parms['control'] = CONTROL_FILE
parms['log'] = LOG_FILE
parms['bad'] = BAD_FILE
parms['discard'] = DISCARD_FILE
cmd = "userid=%(userid)s %(sqlldr)s data=%(data)s control=%(control)s log=%(log)s bad=%(bad)s discard=%(discard)s" % parms
print "cmd is: %s" % cmd
with open('/opt/app/workload/bfapi/bin/stdout.txt', 'wb') as out:
process = call(cmd, shell=True, stdout=out, stderr=out)
print process
cmd是:sqlldr用戶ID = usr / pass行= 1000 readsize = 50000直接= true columnarrayrows = 100 bindsize = 500000 streamsize = 500000靜默=(HEADER,FEEDBACK)data = data.csv控制= raw_table.ctl log = logfile.log錯誤= badfile.log丟棄= discard.log
進程返回1未創建用於日志,壞和丟棄的日志文件
stdout.txt包含/ bin / sh:-c:第0行:意外令牌附近的語法錯誤(' /bin/sh: -c: line 0:
sqlldr userid = usr / pass行= 1000 readsize = 50000直接= true columnarrayrows = 100 bindsize = 500000 streamsize = 500000silent =(HEADER,FEEDBACK)data = data.csv control = raw_table.ctl log = logfile.log bad = badfile.log丟棄= discard.log'
data.csv包含
id~name~createdby~createddate~modifiedby~modifieddate
6~mark~margaret~"19-OCT-16 01.03.23.966000 PM"~kyle~"21-OCT-16 03.11.22.256000 PM"
8~jill~margaret~"27-AUG-16 12.10.12.214000 PM"~kyle~"21-OCT-16 04.16.01.171000 PM"
raw_table.ctl
OPTIONS ( SKIP=1)
LOAD DATA
CHARACTERSET UTF8
INTO TABLE RAW_TABLE
FIELDS TERMINATED BY '~' OPTIONALLY ENCLOSED BY '"' TRAILING NULLCOLS
(ID,
NAME,
CREATED_BY,
CREATED_DATETIME TIMESTAMP,
MODIFIED_BY,
MODIFIED_DATETIME TIMESTAMP)
該錯誤是由靜默參數引起的。 用單引號將其包裝可以使代碼正常工作,如下所示:silent ='(HEADER,FEEDBACK)'
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.