psycopg2 在执行多条语句时出现语法错误

0 投票
1 回答
1985 浏览
提问于 2025-04-17 06:09

我有一些来自 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

我们应该试着把那个错误信息的引号去掉,这样可以更清楚地看到发生了什么。我们可以在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提示符下的尝试,我发现唯一能让“语法错误”信息的“行”以三重引号开头的方法,就是在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代码,我们会帮助你弄清楚字面上的引号是怎么出现在你的字符串里的!

撰写回答