2016-05-03 2 views
0

Вот мой код:psycopg2 cursor.execute не обязательные параметры

with open(params['dataFile']) as df: 

     conn = psycopg2.connect(params['connStr']) 
     cur = conn.cursor() 
     its = 0 

     for line in df: 
      if its == 0: 
       pass 
      else: 
       row = tuple(line.replace('\n','').split(params['delimiter'])) 
       try: 
        cur.execute(params['insQueryStr'],row) 
       except: 
        print(cur.mogrify(params['insQueryStr'],row)) 
        print(row) 
        break 

      its += 1 

     conn.commit 
     conn.close 

Без TRY/улова, он производит это:

psycopg2.ProgrammingError: syntax error at or near "%" 
LINE 1: INSERT INTO mstest values (%s, %s, %s, %s, %s, %s, %s, %s, %... 

С попытке поймать, вызов mogrify печатает это:

b'INSERT INTO mstest values (%s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s,%s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s,%s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s);' 

«% s в моей строке запроса не заменяются элементами второго параметра t он вызывает cur.execute(). Зачем? Когда строка печатается, она содержит значения, которые я ожидаю.

+0

Что такое вывод 'print (row)'? –

+0

('8582665123456789', '' '' '' '' '' '' '' '' '' '' ' , '' FY12_FY12 Q2 Trial Layer _Vue_Sit_Trial_TY_FNL "',' ',' ',' 1112345673742 ',' Unknown ',' Unknown ',' ',' ',' 11123456772393 ',' ',' ',' 11234567160 ',' «Starship - Empowering Media», «,», «11», «AM_NA_United States_Commercial_Cloud & Enterprise_Starship», «1112345155», «Starship Corporation», «», «, '', '', 'v3/gto.-1/bmw1.redefined/bmw2.redefined/atc3.3', '', '', '', '', '', '', '', '' , '') – duuug

ответ

0

От http://initd.org/psycopg/docs/usage.html#query-parameters:

Для позиционных переменных связывания, второй аргумент всегда должен быть последовательностью, даже если он содержит одну переменную. И помните, что Python требует запятые, чтобы создать единый элемент кортежа: `

cur.execute("INSERT INTO foo VALUES (%s)", "bar") # WRONG 
cur.execute("INSERT INTO foo VALUES (%s)", ("bar")) # WRONG 
cur.execute("INSERT INTO foo VALUES (%s)", ("bar",)) # correct 
cur.execute("INSERT INTO foo VALUES (%s)", ["bar"]) # correct 

`

Это может быть то, что вы делаете неправильно кормление кортеж cursor.execute()

+0

Я вставляю последовательность: tuple (line.replace ('\ n', ''). Split (params ['delimiter'])) – duuug

+0

Кортежи работали для меня в прошлых приложениях курсора. execute() – duuug

0

Ваш код должен работать. Я не знаю, почему это не так. Вы говорите, что немного изменили кортеж. Постать кортеж точно так, как есть, а не отредактированную версию. В любом случае следующее намного проще.

Поскольку Psycopg адаптирует Python кортеж к записи Postgresql передать его в качестве единственного параметра:

cur.execute('INSERT INTO mstest values %s', (row,)) 

Обратите внимание на запятую после row. Это делает row кортежем сам параметр.

+0

Привет! Спасибо, что задумался над этим. Я не могу опубликовать образец строки, потому что он содержит данные клиента. Я оставил все синтаксические элементы. Я не думаю, что образец кода будет работать. Вы видите, что строка сама по себе является кортежем, поэтому (строка) является кортежем с одним элементом - кортежем, представляющим мою строку. – duuug

+0

@duuug Обновлено. Сделайте то, что я написал, и вы будете удивлены. –

+0

Traceback (самый последний вызов последнего): Файл "C: \ Continuum \ Anaconda3 \ csv2pg \ csv2pg.py", строка 23, в cur.execute (PARAMS [ 'insQueryStr'], (строка)) psycopg2 .DataError: слишком длинное значение для символа типа (100) – duuug