psycopg2 терпит неудачу при выполнении многих операторов с синтаксической ошибкой - PullRequest
0 голосов
/ 12 ноября 2011

У меня есть данные, поступающие с 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'  

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

Спасибо

1 Ответ

0 голосов
/ 12 ноября 2011

Мы должны попытаться снять с кавычки это сообщение об ошибке, чтобы немного яснее увидеть, что здесь происходит. Мы можем сделать это в приглашении 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», которую он вставляет в перед линии, которая его перепутала. Возможно, ваша вырезка и вставка в переполнение стека разрушили несколько последовательных пробелов, что может произойти, если ваш редактор или браузер были в неприятном настроении.

Так что я не могу точно сказать, где в строке произошла ошибка, но у меня есть очень сильное предположение: каким-то образом тройные кавычки Python, которыми вы пытаетесь окружить свое утверждение, фактически передаются в Postgres! После нескольких минут игры в приглашении Postgres я могу найти только способ получить сообщение о «синтаксической ошибке», в котором «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, и мы поможем вам выяснить, как буквальные кавычки оказываются внутри ваших строк!

...