Сбой при использовании sqlldr в подпроцессе python.call(), но нет информации

#python #linux #csv #sql-loader

#python #linux #csv #sql-загрузчик

Вопрос:

Мне нужна некоторая помощь. Я пытаюсь выполнить SQLLDR из python. Лучшим методом, который я нашел, было использование 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
streamsize= 500000 silent=(ЗАГОЛОВОК, ОБРАТНАЯ СВЯЗЬ) data=data.csv control=raw_table.ctl
log=файл журнала.log bad= плохой файл.удаление журнала=discard.log

процесс возвращает 1 Файлы журнала для log, bad и discard не созданы

stdout.txt содержит /bin/sh: -c: строка 0: синтаксическая ошибка возле неожиданного токена ('
/bin/sh: -c: line 0:
sqlldr userid=usr / pass rows=1000 readsize = 50000 direct= true columnarrayrows=100 bindsize= 500000 streamsize = 500000 silent= (ЗАГОЛОВОК, ОБРАТНАЯ СВЯЗЬ) data=data.csv control=raw_table.ctl log=logfile.log bad= плохой файл.удаление журнала =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)
  

Ответ №1:

Ошибка была вызвана параметром silent. Заключение его в одинарные кавычки позволило коду работать, как здесь: silent='(ЗАГОЛОВОК, ОБРАТНАЯ СВЯЗЬ)’