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'
有人能告诉我可能是什么问题吗?我正在按照 这个 教程进行操作。
谢谢!
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代码,我们会帮助你弄清楚字面上的引号是怎么出现在你的字符串里的!