psycopg2 не удается выполнить много операторов с синтаксической ошибкой

У меня есть данные, поступающие из mongodb , который выглядит как

data = 
(
 {
   u'name': 'A',
   u'primary_key': 1
 },
 {
   u'name': 'B',
   u'primary_key': 2
 },
 {
   u'name': 'C',
   u'primary_key': 3
 }
)

когда я вызываю следующее

cur = conn.cursor()
cur.executemany("""INSERT INTO ddmension(id,name) VALUES (%(primary_key)s, %(name)s)""", data) 

он не говорит

ProgrammingError: 'syntax error at or near """"INSERT INTO dimension (id, name) VALUES (1, E\'A\')""""\nLINE 1: """INSERT INTO dimension (id, name) VALUES (1, E\'A\n ^\n'  

Может ли кто-нибудь помочь мне в этом вопросе? Я следую этому учебнику

спасибо

0
тот факт, что в названии таблицы есть опечатка, означает, что вы не опубликовали точный код и/или выходные данные, которые вы получили.
добавлено автор jfs, источник
Что показывает cur.mogrify (args_to_executemany) ?
добавлено автор jfs, источник

1 ответы

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

>>> message = 'syntax error at or near """"INSERT INTO dimension (id, name) VALUES (1, E\'A\')""""\nLINE 1: """INSERT INTO dimension (id, name) VALUES (1, E\'A\n ^\n'
>>> print message
syntax error at or near """"INSERT INTO dimension (id, name) VALUES (1, E'A')""""
LINE 1: """INSERT INTO dimension (id, name) VALUES (1, E'A
 ^

Ах, намного лучше.

Обычно Postgres осторожно использует маленький символ ^ , чтобы указать точное место в строке, где он запутался, но здесь он указывает на середину метки «Линия 1», что он помещает front в строку, которая его путала. Вероятно, ваша вырезка и вставка в Stack Overflow объединила несколько последовательных пробелов, что может произойти, если ваш редактор или браузер были в неприятном настроении.

Поэтому я не могу точно указать, где в строке произошла ошибка, но у меня есть очень сильная догадка: так или иначе, тройные кавычки Python, с которыми вы пытаетесь окружить ваше утверждение, действительно передаются в Postgres! После нескольких минут игры в приглашении Postgres, only , который я могу найти, чтобы получить сообщение «синтаксическая ошибка», чья «LINE» начинается с тройных кавычек, состоит в том, чтобы на самом деле ввести тройные кавычки вручную в SQL, где они не принадлежат (поскольку Postgres не понимает тройное цитирование, это соглашение Python):

$ psql postgres 
Null display is "NULL".
psql (8.4.8)
Type "help" for help.

postgres=# """SELECT 1""";
ERROR:  syntax error at or near """"SELECT 1""""
LINE 1: """SELECT 1""";
        ^

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

cur.executemany('"""INSERT INTO ddmension(id,name) ..."""', data) 

Существуют и другие способы получить тройные кавычки внутри строки Python, но это самый простой. В любом случае ваше сообщение об ошибке Postgres, безусловно, показывает, что тройные кавычки попадают внутрь вашего SQL, поэтому попробуйте снова проверить код Python, и мы поможем вам разобраться, как буквальные кавычки заканчиваются внутри ваших строк!

0
добавлено
Python
Python
7 654 участник(ов)

Уютный чат для профессионалов, занимающихся поиском питоньих мудростей. Как не получить бан: https://t.me/ru_python/577926

Python beginners
Python beginners
4 449 участник(ов)

Вопросы про Python для чайников. Cпам и троллинг неприемлем. Не злоупотребляйте стикерами. Частозадаваемые вопросы: https://github.com/ru-python-beginners/faq/blob/master/README.md Статистика тут: https://grstats.me/chat/x4qym2k5uvfkr3al6at7

DBA - русскоговорящее сообщество
DBA - русскоговорящее сообщество
1 345 участник(ов)

Общаемся и обсуждаем темы, посвященные DBA, PostgreSQL, Redis, MongoDB, MySQL, neo4j, riak и т.д. См. также: @devops_ru, @kubernetes_ru, @docker_ru, @nodejs_ru Рекомендуем сразу отключить уведомления, чтобы пребывание здесь было полезным и комфортным.

pro.python
pro.python
1 090 участник(ов)

Сообщество разработчиков под Python Создатель: @rodgelius

MongoDB Russian
MongoDB Russian
1 086 участник(ов)

> db.stats() https://combot.org/chat/-1001035023078

Rude Python
Rude Python
971 участник(ов)

Python без „девочек”, здесь матерятся и унижают Django. Not gay friendly. Правила: t.me/rudepython/114107 @rudepython | t.me/rudepython

rupython
rupython
509 участник(ов)

Группа создана с целью оперативного получения ответов на возникающие вопросы по разработке на яп python, смежные темы, а также человеческого общения. Приветствую!

Python-programming
Python-programming
266 участник(ов)

Чат группы вконтакте https://vk.com/python_community