2016-10-05 6 views
0

Я пытаюсь использовать psycopg2 для вставки строки в таблицу из списка python, но возникают проблемы с форматированием строки.psycopg2 не все аргументы, преобразованные во время форматирования строки

Таблица имеет 4 столбца типов (1043-varchar, 1114-timestamp, 1043-varchar, 23-int4). Я также делал попытки с 1082-date вместо метки времени и 21-int2 вместо int4.

следующее заявление отлично работает в pgAdmin или через psycopg2 исполнения курсора без строки форматирования:

INSERT INTO ssurgo.distmd VALUES ('5', '2015-01-01', 'Successful', 4891); 

Однако, если я:

sql_text = "INSERT INTO ssurgo.distmd VALUES %s ;" 
data = ['5', '2015-01-01', 'Successful', 4891] 
data[1] = date.today() # ensure psycopg2 recognizes a date using datetime 
print(curs.mogrify(sql_text, data)) 

я получаю:

TypeError: not all arguments converted during string formatting 

Я получаю ту же ошибку, если я сохраню дату как строку «2015-01-01» вместо datetime.date obje ct, и если я использую curs.execute (sql_text, data), а не mogrify.

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

Кто-нибудь знает, почему форматирование строки psycopg2 дает ошибку?

+0

У вас есть только один заполнитель для четырех значений. – Keith

ответ

1

Вы можете сохранить исходный код, но проход кортеж в вместо списка:

sql_text = "INSERT INTO ssurgo.distmd VALUES %s ;" 
data = ('5', date.today(), 'Successful', 4891) 
print(curs.mogrify(sql_text, [data])) 

Обратите внимание, что вы передаете одно значение, поэтому необходимо обернуть его в итератор, который является то, что ожидает Psycopg. Кортеж будет адаптирован Psycopg к правильному синтаксису values: запись

+0

Спасибо - это больше поведение, которое я ожидал. Я попробовал что-то подобное на этом пути, но попытался преобразовать в кортеж во втором аргументе mogrify. Я предполагаю, что он должен быть кортежем во второй строке (не в списке), а затем должен быть частью одного списка элементов в третьей строке. –

+0

Можно преобразовать в кортеж в аргументе mogrify, но синтаксис сложный. –

+0

print (curs.mogrify (sql_text, [tuple (data)]) работал, но не так читаем. –

0

Благодаря @Keith за помощью. Я ожидал, что psycopg2 сделает больше, чем на самом деле. Поскольку я занимаюсь разработкой сценария для перебора несколько сот текстовых файлов для импорта в различные таблицы, я хочу что-то, что может работать с различными размерами стола и сделал следующее изменение:

sql_text = "INSERT INTO ssurgo.distmd VALUES (%s);" 
data = ['5', '2015-01-01', 'Successful', 4891] 
data[1] = date.today() # ensure psycopg2 recognizes a date using datetime 
placehold = ['%s' for _fld in data] 
sql_text = sql_text % ', '.join(placehold) 
print(curs.mogrify(sql_text, data)) 

 Смежные вопросы

  • Нет связанных вопросов^_^