【问题标题】:Using sqlldr in python subprocess.call() fails, but no information在 python subprocess.call() 中使用 sqlldr 失败,但没有信息
【发布时间】:2016-10-23 01:25:26
【问题描述】:

我需要一些帮助。我正在尝试从 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 userid=usr/pass rows=1000 readsize=50000 direct=true columnarrayrows=100 bindsize=500000 流大小=500000 静默=(HEADER,FEEDBACK) 数据=data.csv 控制=raw_table.ctl log=logfile.log bad=badfile.log discard=discard.log

进程返回 1 未创建 log、bad 和 discard 的日志文件

stdout.txt 包含 /bin/sh: -c: line 0: 意外标记附近的语法错误(' /bin/sh: -c: line 0:sqlldr userid=usr/pass rows=1000 readsize=50000 direct=true columnarrayrows=100 绑定大小=500000 流大小=500000 静默=(HEADER,FEEDBACK) 数据=data.csv 控制=raw_table.ctl log=logfile.log bad=badfile.log discard=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)

【问题讨论】:

    标签: python linux csv sql-loader


    【解决方案1】:

    错误是由静默参数引起的。用单引号括起来可以使代码正常工作,如下所示:silent='(HEADER,FEEDBACK)'

    【讨论】:

      猜你喜欢
      • 2020-03-29
      • 2010-09-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多