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

标签 python sqlite python-2.x

我在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]

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

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

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

编辑:

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

最佳答案

它的处理方式有所不同,因为您正在参数化查询。您无法真正参数化这样的列名称。它试图保护您免受 SQL 注入(inject)的影响,因此它(我在这里进行了简化,但基本上是)在将任何字符串传递给 SQL 引擎之前将其封装在引号中。

本质上,SQLlite 正在尝试对字符串文字“posemo”进行平均

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

关于Python SQL游标给出不同的结果?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13367507/

相关文章:

iphone - 将值插入 sqlite 数据库

r - 如何一次执行多个 RSQLite 语句或如何转储整个文件?

android - 如何将 SQLite 创建的数据上传到 MySQL 服务器?

python - 为什么我不能在函数中使用 `import *`?

variables - 变量总是四舍五入到小数点后两位 - Python

python - 使用python获取列表中的最大重复项索引

python - 需要此 'Invalid Syntax error'的帮助

python - 用 HTML 标记替换电子邮件 ID 以在文本中创建超链接

python - 为什么第一次迭代中的对象在第二次迭代中被删除?

python - 调用 python3 的同级方法?