2017-03-29 41 views
3

我有一個Web應用程序在我的ubuntu 16 & Nginx + uwsgi上使用SQLAlchemy和MySQL服務器。SQLAlchemy查詢返回無

在創建引擎,我把

echo=True 

得到的查詢追蹤。我有問題的用戶註冊,每次user_loader被稱爲在燒瓶登錄,我執行:

dbsession.query(User).filter_by(id=user_id).first() 

結果我得到的是:

INFO sqlalchemy.engine.base.Engine SELECT user.id AS user_id, user.name AS user_name, user.email AS user_email, user.pass$ 
Mar 29 23:48:56 ubuntu-512mb-sgp1-01 uwsgi[26160]: FROM user 
Mar 29 23:48:56 ubuntu-512mb-sgp1-01 uwsgi[26160]: WHERE user.id = %s 
Mar 29 23:48:56 ubuntu-512mb-sgp1-01 uwsgi[26160]: LIMIT %s 
Mar 29 23:48:56 ubuntu-512mb-sgp1-01 uwsgi[26160]: 2017-03-29 23:48:56,517 INFO sqlalchemy.engine.base.Engine ('61', 1) 

結果是無。但是,在上面的例子中,使用user_id = 61,我可以在ubuntu上的mysql shell中找到用戶以獲得用戶ID 61.

當我刷新頁面幾次時,結果會出來。 一旦用戶完成註冊,他們將被重定向到登錄頁面,在完成形式,它顯示錯誤「請註冊」,這是觸發,如果用戶正在使用該查詢現在發現:

dbsession.query(User).filter_by(id=user_id).first() 

在註冊我的代碼是:

user = User(name=name, email=email, password=password) 
dbsession.add(user) 
dbsession.commit() 
return redirect(url_for('login')) 

檢查已完成確保名稱,電子郵件密碼有效。

謝謝

+0

請提供[最小,*完整*和*可驗證*示例](http://stackoverflow.com/help/mcve)。您的問題可能源於多種原因。例如,MySQL的默認事務隔離級別是[REPEATABLE READ](https://en.wikipedia.org/wiki/Isolation_(database_systems)#Repeatable_reads),因此如果由於任何原因您的事務徘徊不前,您將無法閱讀新鮮事數據。什麼是「然而,用戶ID 61是有效的並且可以被調用。」意思是。它怎麼能被「叫」? –

+0

也許是一個錯誤的數據庫? –

+0

@IljaEverilä如果您看到user.id作爲61傳入(不重要'61'或61)。我試着使用session.execute查詢數據庫,並返回正確的用戶。然而,這個session.query()。first()會一直迴應None,有時候會返回一個User對象。如何確保新數據在裏面? –

回答

0

解決了這個問題。

感謝@iljaEverila。

基本上我需要確保SQLAlchemy的dbsession持久化數據並且沒有掛起的事務。因此,一旦用戶註冊並user_loader是調用,我只需要調用:

dbsession.commit() 

則調用此:

dbsession.query(User).filter_by(id=user_id).first() 

一定會成功。

謝謝

+0

好,你得到了它,但這是一個更大的問題上的創可貼:爲什麼你的交易在請求之間「泄漏」。可能是一個配置問題,或者可能是與此相關的東西:http://stackoverflow.com/questions/23301968/invalid-transaction-persisting-across-requests –

+0

也許有點壞主意提交狀態,你不在視圖中進行控制。回滾將是「更安全」的選擇。 –

+0

@IljaEverilä更新我的代碼回滾,它工作正常。謝謝!順便說一句,什麼樣的配置問題可能會導致泄漏? Cos這是我第一次設置Ubuntu服務器。需要拿起件 –