2011-06-27 65 views
1

我有一個用戶更新功能,我允許用戶更改他們的電子郵件地址,但同一地址在數據庫中必須是唯一的,所以在更新之前,我必須檢查他們的新電子郵件是否已存在於數據庫中,但我用來檢查的查詢返回同一行。例如:sqlalchemy查詢問題

user = User.query.get(1) 
user.email = '[email protected]' 

if user.validate(): # The validate function performs a query to see if '[email protected]' is already taken 
     user.save() 

現在正在進入驗證功能,我有:

check = User.query.filter_by(User.email='[email protected]').first() 
if check: 
     # email already exists 

問題是,check持有我的編輯同一個用戶。 Sqlalchemy將更新提交給數據庫,但在某種事務下,所以我的查詢返回了我正在編輯的同一用戶。我已經通過創建第二個會話對象解決了這個問題,但看起來像是過度的。任何更好的想法?我有道理嗎?

回答

1

在操縱現有用戶之前,爲什麼不檢查具有給定電子郵件地址的用戶是否存在?你可以例如寫一個獨立的功能爲:

def user_email_exists(email): 
    return (not User.query.filter(User.email=email) == None) 

試圖改變用戶對象之前,然後調用user_email_exists

... 

# User object to alter 
user = ... 

# the new email address, which needs to be checked 
new_email_addr = '[email protected]' 

if user_email_exists(new_email_addr): 
    raise SomeMeaningfulException() # or some `flash` message + a redirect 
else: 
    user.email = new_email_addr 
    db.session.add(user) 
    db.commit() 

... 
+0

用戶名也是唯一的等等等等。我更喜歡我自己的方法,而不是在驗證過程之外編寫各種函數和查找,以獲得相同的結果。 數據被大量分配,驗證和保存/更新。我試圖避免給個別領域過多的關注,這會導致很多不應該存在的代碼(驗證過程之外)。我有它的工作,但與第二屆會議,查詢外的第一個查詢的會話/交易 –

0

最簡單的方法可能只是在驗證函數中向查詢添加第二個過濾器。不要選擇具有該電子郵件地址的任何用戶,而要選擇具有該電子郵件地址的任何用戶,而不要使用相同的用戶名或用戶標識。這樣,您確保只有在不同的用戶擁有該電子郵件地址時才能獲得回報。