2012-11-16 60 views
5

我正在嘗試執行一些使用mysql-flask python擴展名的sql。下面的代碼總是由於某種原因返回一個長。AttributeError:'長'對象沒有屬性'fetchall'

stringify = lambda x : '"' + x + '"' 
if request.method == 'POST': 
     sql = "select * from users where username = " + stringify(request.form['username']) 
     user = g.db.cursor().execute(sql).fetchall() 

錯誤:

user = g.db.cursor().execute(sql).fetchall() 
AttributeError: 'long' object has no attribute 'fetchall' 

爲什麼沒有能返回結果集?

此外,我可以執行插入語句就好了。

FIX(ANSWER):

def get_data(g, sql): 
    cursor = g.db.cursor() 
    cursor.execute(sql) 
    data = [dict((cursor.description[idx][0], value) for idx, value in enumerate(row)) for row in cursor.fetchall()] 
    return data 
+1

您可能還想查看字符串格式,特別是使用execute函數。你可以寫'sql ='select * FROM用戶,其中username =「%s」''然後'cursor.execute(sql,(request.form.username,))'(參見這裏的例子http:// mysql- python.sourceforge.net/MySQLdb.html#cursor-objects) – jmilloy

回答

10

您試圖調用一個方法上的Cursor.execute結果,其中DB-API specification說是不確定的(你使用出現的實施將返回一個整數)。相反,您想要在遊標對象上調用fetchall。例如:

cursor = g.db.cursor() 
cursor.execute(sql) 
user = cursor.fetchall() 
+0

任何想法如何把它變成一本字典?看起來返回的對象很原始。不知道我們如何設置密鑰,而沒有關於返回列的更多信息,即調用dict()將不夠。 –

+0

您可以使用遊標上的'description'屬性來計算出列的內容。也就是說,如果你詢問你之後的數據而不是詢問所有列,那麼你的代碼會更加健壯(這樣你應該知道每個元組項目在手之前)。如果你需要更高層次的界面,也許可以考慮使用Storm,SQLAlchemy或Django的ORM等ORM。 –

+0

我肯定會與SQLAlchemy的去,但這個項目的要求將不允許奧姆斯 –

相關問題