3

我在 Python 2.7中使用 PyMySQL并尝试执行以下语句:

'INSERT INTO %s (%s, %s) VALUES (%s, %s) ON DUPLICATE KEY UPDATE %s = %s'

使用以下参数:

('artikel', 'REC_ID', 'odoo_created', u'48094', '2014-12-23 10:00:00', 'odoo_modified', '2014-12-23 10:00:00')

总是导致:

{ProgrammingError}(1064, u"您的 SQL 语法有错误;请查看与您的 MySQL 服务器版本对应的手册,了解在 ''artikel' ('REC_ID', 'odoo_created') 附近使用的正确语法\n
VALUES ('48094', '2014-12-' 在第 1 行")

在我看来,PyMySQL 在格式化期间转义了所有字符串。对于表名和列名等数据库标识符,如何防止这种情况发生?它破坏了语句,因为与表 ( ) 相比,SELECT字符串文字 ( SELECT * FROM "table") 中的 s 是不可能的SELECT * FROM table

4

1 回答 1

1

这就是 DB API 替换的重点。它转义值。您真的不需要转义表/列名。

我会使用类似的东西:

execute('''INSERT INTO {} ({}, {}) VALUES (%s, %s) ON DUPLICATE KEY UPDATE {} = %s'''
    .format('artikel', 'REC_ID', 'odoo_created', 'odoo_modified'),
    (u'48094', '2014-12-23 10:00:00', '2014-12-23 10:00:00')
)

或者,你知道,直接写名字。

于 2014-12-23T10:45:35.213 回答