所以我试图将自己的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,4
或5
等
避免此问题的任何明显提示?
答案 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:])