psycopg2(python)的SQL语法错误

时间:2018-03-07 21:14:42

标签: python postgresql python-3.6 psycopg2

所以我试图将自己的sqlite3写入postgresql迁移脚本,该脚本将所有表从一个数据库转移到另一个数据库。

我目前看到以下语法错误:

ERROR: syntax error at or near "'name'"
LINE 1: UPDATE django_site SET ('name', 'domain')=('127.0.0.1:8080',...
                                ^

它不太喜欢('name', 'domain') ......我或许会想到我有一些微妙的东西......

('name', 'domain')由以下代码行生成:

col = tuple([desc[0] for desc in self.cur_sql3.description])

即,将所有列名称作为生成的list,然后转换为tuple类型。

目前正在构建SQL查询:

cur_psql.execute("UPDATE {0} SET {1}={2} WHERE id={3}".format(table[0], col[1:], row[1:], col[0]))

table[0]表名col[1:]是除主要ID键之外的所有内容,row[1:]是所有行值减去主键,而col [0]是主键值,例如1,2,3,45

避免此问题的任何明显提示?

1 个答案:

答案 0 :(得分:0)

您需要将其拆分为单独的SQL语句,或者您需要对列值对进行某种循环。我需要更多信息来编写更正的Python代码,但您的SQL应该是这样的:

UPDATE table SET col = val WHERE id = id_val

你正在做类似的事情:

UPDATE table SET ('col1', 'col2') = ('val1', 'val2')

如果您想在一个语句中更新多个列,请执行以下操作:

UPDATE table SET col1 = val1, col2 = val2 WHERE id = id_val

请注意,如果他们是字符列,则需要转义您的值(但如果它们是数字的话,则不是这样),如下所示:

UPDATE table SET col1 = 'character value', col2 = 123 WHERE id = 1

最终,这应该使用绑定变量而不是字符串格式来完成,因为字符串格式化可以将您的代码暴露给SQL注入攻击(如果这严格地是您自己运行的实用程序脚本,则可能不会引起关注不管怎样,这是一个很好的习惯。您可以在psycopg2中找到绑定变量的文档:http://initd.org/psycopg/docs/usage.html#query-parameters

按照我的建议,会产生如下结果:

set_clauses = ",".join(["{} = %s".format(col) for col in col[1:]])
query = "update {} set {} where id = {}".format(table[0], set_clauses, row[0])
cur_psql.execute(query, row[1:])