2014-01-16 36 views
0

代碼:瓶 - 檢查數據庫對字符串

userExists = g.db.execute('SELECT username FROM users WHERE username = ?', [request.form['usr']]) 

if request.form['usr'] == userExists: 
    error = 'Username already exists.' 

希望的代碼是不言自明的。如果沒有,我想要一個註冊用戶對數據庫檢查他的名字。用戶名必須是唯一的,所以如果輸入到表單中的信息(request.form ['usr'])等於保存到userExists變量的SQL查詢的結果,那麼應該拋出一個錯誤(error ='Username already exists 。')。

該查詢是否返回匹配用戶名而不是用戶名值的行數?或者是邏輯錯誤。

回答

1

您可以通過在創建表格時將username定義爲唯一鍵來實現。然後將INSERT放入try ... catch ...區塊。如果用戶名存在,則會拋出異常。

0

假設你正在使用的sqlite3通過使用g.db.execute的指示和你一直保持着,當它被創建,你可以做這樣的事情,因爲在用戶名列的唯一索引:

username = request.form['usr'] 
print "Attempting to insert username = %s" %username 
try: 
    g.db.execute("insert into users(username) values('%s')" %username) 
except sqlite3.IntegrityError: 
    print 'Username %s is already in database' %username 
    g.db.rollback() 
except: 
    g.db.rollback() 
    #Handle other errors as desired. 
finally: 
    g.db.commit() 

g.db.close() 

不幸的是,你不能改變一個表來添加唯一的索引或主鍵。但是,如果你仍然在設計,這應該工作。

+0

爲什麼第二個除了沒有()後回滾?爲什麼你甚至需要第二個除外。 –

+0

語法錯誤,已更正。這確實是一個偏好問題。鑑於代碼是在finally塊中提交的,可能需要確保沒有任何導致錯誤條件的事件捕獲到except塊之前的數據庫修改。當try塊包含比本例中更多的數據庫交互代碼時,這是一個好習慣。第二個除外塊是處理與唯一約束衝突不同的錯誤。 – Spade