psycopg2在执行many语句时失败,语法错误

时间:2011-11-12 01:13:07

标签: python mongodb 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'  

有人可以指导我的问题是什么吗?我正在关注this教程

谢谢

1 个答案:

答案 0 :(得分:0)

我们应该尝试取消引用该错误消息,以便更清楚地了解这里发生了什么。我们可以在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”标签的中间位置放入混淆它的行的前面。可能你在Stack Overflow中的剪切和粘贴会将几个连续的空间折叠在一起,如果您的编辑器或浏览器处于令人不快的心情,这可能会发生。

所以我无法准确地确定错误发生在哪一行,但我有一个非常强烈的猜测:不知何故,你试图围绕你的声明的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代码,我们将帮助你弄清楚文字引号如何在你的字符串中清盘!