1

私は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 関数が異なるものを返すのはなぜですか? 私は何を間違っていますか?

編集

疑問符を取り除き、文字列を直接フォーマットすると機能するようになりました。この場合、パラメータ化されたクエリが機能しないのはなぜですか?

4

1 に答える 1

2

クエリをパラメータ化するため、処理方法が異なります。そのような列名を実際にパラメーター化することはできません。SQLインジェクションからユーザーを保護しようとしているため、SQLエンジンに渡す前に、文字列を引用符で囲んでカプセル化します(ここでは単純化していますが、基本的には)。

基本的に、SQLliteは文字列リテラル「posemo」を平均化しようとしています

制限をパラメーター化しておくこともできますが、列名に関しては、ハードコーディングするか、フォーマットのような文字列に入れる必要があります。

于 2012-11-13T20:04:15.293 に答える