如何防止 PyMySQL 转义标识符名称?

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服务器版本手册以获取正确的语法,以在行1处使用“'artikel'('REC_ID','odoo_created')\ n
VALUES('48094','2014-12-'")

这似乎是PyMySQL在格式化期间对所有字符串进行转义。我如何防止对于表和列名等数据库标识符的转义?这会损坏语句,因为与表(SELECT * FROM table)相比,无法从字符串字面值(SELECT * FROM "table")中选择。

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')
)

或者,你知道的,直接写出名称。


花括号({})在Python 2.7中对我无效。在命令行中进行的“herp {}”%(“derp”)的简单测试产生了相同的结果。但是,使用%s可以正常工作。 - Peter
@Alomvar 好的,你犯了一个错误。"{}".format"%s"% 是不同的东西。 - Oleh Prypin
是的,现在我明白了(我之前怎么没看出来?!)。我也找到了TypeError问题的原因:在一个堆栈帧中,由于使用了*args,参数被塞进了一个元组中。 - Peter
1
如果列名来自用户,则确实需要转义。例如,从像?sort=foo这样的URL中获取的ORDER BY {sort}'.format(sort=sort) - six8
1
“你不应该这样做”有时候并不是你要找的答案。 - Sebastian Wozny
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接