繁体   English   中英

Python SQL 游标给出不同的结果?

[英]Python SQL cursor giving different results?

我在 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', '>')调用它并将这个输出到标准输出:

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]

我将标准输出中的确切表达式复制并粘贴到我打开的 SQLite 进程中,然后得到:

1.8730701754386
2.48962719298246
2.18607456140351
2.15342105263158
2.33107456140351
2.11631578947368
2.37100877192982
1.95228070175439
2.01013157894737
...
3.37183673469388

所以根本不是0。 尽管使用相同的查询,为什么我的 Python 函数返回不同的东西? 我究竟做错了什么?

编辑

当我去掉问号并直接格式化字符串时,它现在可以工作了。 为什么在这种情况下参数化查询不起作用?

它的处理方式不同,因为您正在参数化您的查询。 你真的不能像那样参数化一个列名。 它试图保护您免受 SQL 注入,因此它(我在这里简化,但基本上)在将任何字符串传递给 SQL 引擎之前将其封装在引号中。

本质上,SQLlite 试图平均字符串文字 'posemo'

您可以将限制参数化,但是当涉及到列名时,您需要对它们进行硬编码,或者将它们以类似格式的形式放入字符串中。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM