2009-11-04 80 views
1

嘿,想知道是否有人可以幫助SQL和Python的新手。我認爲我對它有一個相當好的把握,不過最近發生了一些奇怪的事情。SQL返回額外的數據

這裏是從較大的部分剪斷的以下代碼:

try: 
     self.db.query("SELECT * FROM account WHERE email = '{0}' AND pass = '{1}'".format(self.mail.strip(self.bchars),self.pw.strip(self.bchars))) 
    except MySQLdb.Error, e: 
     print "Error %d: %s" % (e.args[0], e.args[1]) 

    exists = self.db.store_result().fetch_row() 
    print "EXISTS",exists 

它用來打印該:

EXISTS ((2, '[email protected]', '1234', 1, 0, 2161, '192.168.1.47', 0),) 

現在,它打印這樣的: 它用來打印該:

EXISTS ((2L, '[email protected]', '1234', 1L, 0L, 2161, '192.168.1.47', 0L),) 

我不知道這些L's來自哪裏。我檢查了SQL數據庫,甚至重新加載它。我已將所有代碼恢復到最後一天(所有代碼都在運行),但仍無法找到解決方案。我也試過搜索,但我甚至不知道這個問題甚至被稱爲是什麼,所以很難搜索。感謝任何人可以提供的幫助或信息。

回答

7

我認爲,python的dbapi應該總是返回整數字段。

無論如何,10L,5L等等是repr(在您的案例中用於元組的每個項目)的方式都可以長時間工作。

還有一件事。我明白了,你正在使用MySQLdb。在這種情況下,我強烈建議您停止使用c-api包裝,而是使用「真實」界面,它具有所有自動轉換/轉義以及其他一些精彩的東西(一個是dict-cursors)。

這將爲您節省很多的痛苦,並會使您的代碼更穩定/安全。總之,只要忘記_mysql。相信我。

你舉的例子可以被改寫,因爲這(使用適當的接口):

import MySQLdb 

db = MySQLdb.connect(host=your_host, db=your_db, 
        user=your_user, passwd=your_password) 

cur = db.cursor() 
cur.execute("""SELECT * FROM account WHERE email = %s AND pass = %s """, 
      (self.mail, self.pw)) 
result = cur.fetchall() 
print "exists:", result 

這不一樣的,你正在做的(除了錯誤處理),而無需人工字符串格式化,逃逸等上。

我知道,這將是downvoted的無關,可能是,但如果這個答案可以幫助甚至人開始使用適當數據庫API,這將是真正偉大的。

+0

哇哦,不知道有一個不同的MySQL模塊一起工作。我一定會改用這種方式。感謝您的高舉。 :) – Chuck 2009-11-04 10:56:03

1

這是因爲SQL中的數據類型是'long'嗎?正如你在元組中看到的那樣,它們仍然是有效的數字,而不是字符串,所以這不應該造成任何問題。

1

L表示數字是Long類型。你在db中的字段類型可能被設置爲這種類型。

2

2L是2的長版本:不同的對象,但具有相同的值。

>>> print 2L == 2 
True 

>>> print 2L is 2 
False 

你運行的是否都一樣(python,packages,db,OS ...)?

+0

哦,我明白了。是的,沒有額外的軟件包,或從python,操作系統或數據庫本身以來的變化。有什麼奇怪的是我真的有過時的代碼,做幾乎相同的查詢,並得到這個結果: ((「2」,「[email protected]」,「1234」,「1」,「0」,「2165 」,‘192.168.1.47’,‘1’),) 我肯定有東西在我的代碼...某處。然而,我從來沒有真正指出過長期或任何令我困惑的事情。謝謝。 – Chuck 2009-11-04 10:53:29

+0

什麼是db模式?什麼是過時的代碼,什麼是新的代碼 – Mark 2009-11-04 12:36:07