MySQL Python查询单独工作,但在参数化时失败

时间:2016-06-13 15:27:57

标签: python mysql json

基本上,我有一个像这样的MySQL表:

CREATE TABLE markets (
    id INTEGER AUTO_INCREMENT NOT NULL,
    root_symbol VARCHAR(64) NOT NULL, 
    metadata JSON NOT NULL, 
    PRIMARY KEY (id)
);

元数据列包含如下的JSON文档:

metadata = {
    'tick_size': 0.01, 
    'currency': 'USD'
}

在Python中,以下两行有效:

cur.execute("SELECT root_symbol FROM markets WHERE JSON_EXTRACT(metadata, '$.currency') = 'USD'")
cur.execute("SELECT root_symbol FROM markets WHERE JSON_EXTRACT(metadata, '$.tick_size') = 0.25")

然而,当参数化时,这2个不会:

cur.execute("SELECT root_symbol FROM markets WHERE JSON_EXTRACT(metadata, '$.%s') = %s", ('currency', "USD"))
cur.execute("SELECT root_symbol FROM markets WHERE JSON_EXTRACT(metadata, '$.%s') = %s", ('tick_size', 0.25))

有人可以向我解释为什么以及如何解决这个问题?谢谢!

1 个答案:

答案 0 :(得分:1)

您需要参数化JSON_EXTRACT()的整个字段值:

cur.execute("""
   SELECT root_symbol 
   FROM markets 
   WHERE JSON_EXTRACT(metadata, %s) = %s""", ('$.currency', "USD"))

cur.execute("""
   SELECT root_symbol 
   FROM markets 
   WHERE JSON_EXTRACT(metadata, %s) = %s""", ('$.tick_size', 0.25))

请注意占位符周围没有引号 - 如果需要,数据库驱动程序会自动放置它。