2012-11-13 53 views
1

我已經在Python以下功能:Python SQL遊標給出不同的結果?

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函數儘管使用相同的查詢返回不同的東西?我究竟做錯了什麼?

編輯

現在,當我擺脫了問號,直接格式化字符串工作。爲什麼在這種情況下參數化查詢不起作用?

+0

您確定打印的語句與cursor.execute中的查詢完全相同嗎?你如何格式化字符串有一個細微的差別。 cursor.execute是否會替換每個?與列表中的相應條款? – ajon

+0

當您通過python直接執行操作時,您是否連接到其他數據庫? – Gerrat

+0

@ajon ahhh,你是對的,它工作時,我格式化字符串,而不是做參數化查詢... – wrongusername

回答

2

它的處理方式不同,因爲您正在參數化您的查詢。你不能真正參數化一個列名。它試圖保護你免受SQL注入,所以它是(我在這裏簡化了,但基本上)在將所有字符串傳遞給SQL引擎之前,用引號將其封裝起來。

從本質上講,SQLlite試圖平均字符串文字「posemo」

你可以把你的極限參數,但是當它涉及到的列名,你需要讓他們硬編碼或者把他們的東西在字符串中像格式。