我在Python中有以下功能:
def get_emo_results(emo, operator):
cursor.execute("SELECT avg(?) FROM [LIWC Post Stats] "
"WHERE goals_scored {0} goals_taken "
"GROUP BY post_number "
"ORDER BY post_number ASC "
"LIMIT ?".format(operator), [emo, posts_limit])
print "SELECT avg({1}) FROM [LIWC Post Stats] "\
"WHERE goals_scored {0} goals_taken "\
"GROUP BY post_number "\
"ORDER BY post_number ASC "\
"LIMIT {2}".format(operator, emo, posts_limit)
return [x[0] for x in cursor.fetchall()]
我用get_emo_results('posemo', '>')
调用它并将此输出发送到stdout:
SELECT avg(posemo) FROM [LIWC Post Stats] WHERE goals_scored > goals_taken GROUP BY post_number ORDER BY post_number ASC LIMIT 200
但是,函数本身返回
[0.0, 0.0, 0.0, 0.0, 0.0, ... 0.0]
我将stdout中的确切表达式复制并粘贴到我打开的SQLite进程中,我得到了这个:
1.8730701754386
2.48962719298246
2.18607456140351
2.15342105263158
2.33107456140351
2.11631578947368
2.37100877192982
1.95228070175439
2.01013157894737
...
3.37183673469388
所以不是0。尽管使用相同的查询,为什么我的Python函数会返回不同的东西?我做错了什么?
修改:
当我摆脱问号并直接格式化字符串时,它现在有效。为什么参数化查询在这种情况下不起作用?
答案 0 :(得分:2)
由于您正在对查询进行参数化,因此处理方式不同。你不能像这样真正地参数化列名。它试图保护你免受SQL注入,所以它(我在这里简化,但基本上)在将任何字符串封装到引号之前将其传递给SQL引擎。
基本上,SQLlite试图平均字符串文字'posemo'
您可以保持限制参数化,但是当涉及列名称时,您需要对它们进行硬编码,或者将它们放在字符串中,格式类似。