2011-11-12 42 views
0
checkSql = 'SELECT userid FROM bs_members WHERE userid = :checkUser' 
doesUserExist = False 
while True: 
    doesUserExist = False 
    newUser.userID = ga.getInput('Enter userID: ', "\w+$") 
    checkUserID = ds.execute(checkSql,checkUser=newUser.userID) 
    for row in ds: 
     if row == checkUserID: 
      doesUserExist = True 
      print 'That user name is already in use. Please enter a new username.' 
      break 
    if doesUserExist == False: 
     break 
    else: 
     continue 

我在Python 2.7中使用cx_Oracle模塊。我正在嘗試提示用戶輸入用戶ID。然後程序將檢查用戶標識是否已經存在,以及是否提示用戶輸入不同的用戶標識。 execute方法是一種幫助方法,它使用cx_Oracle的execute方法與Oracle數據庫進行交互。 getInput方法提示用戶輸入,然後使用正則表達式進行檢查。我不明白爲什麼這個循環終止它的方式

我知道我有這個錯誤,但我相信while循環啓動第一個採取的操作是提示用戶輸入用戶ID。然後根據數據庫檢查用戶ID。 for循環啓動並檢查ds.execute()返回的行是否與用戶提供的用戶ID相同。如果是用戶被告知使用其他用戶名,並且break退出for循環。然後,if語句將檢查用戶是否存在,如果不存在,則會中斷while循環。如果不是,則循環迭代while,以便提示用戶輸入不存在的用戶ID。

會發生什麼情況是提示用戶輸入用戶ID,然後沒有任何檢查發生在用戶身上,程序移動到下一段代碼。我在這裏錯過了什麼?我已將link包括到​​的文檔中。在上面的代碼執行方法是以下的輔助方法的一部分:

def execute(self, statement, **parameters): 
    if parameters is None: 
     self._curs.execute(statement) 
    else: 
     self._curs.execute(statement,parameters) 

如果我需要提供更多的信息,讓我知道。

編輯:我忘記while循環開始後立即行doesUserExist = False,所以我補充說。

+0

當前行爲如何偏離您的預期行爲? – Blender

+0

恩,不應該只是使用'COUNT()'來檢查結果值嗎? –

+0

'if doesUserExist == False:break'?請解釋這裏的邏輯。 –

回答

4

您的自定義execute方法不會返回任何含義,即代碼中的checkUserID將是None

此外,您感興趣的是查詢返回至少一行。如果沒有,那麼用戶ID應該可用。

該文檔說如果沒有更多行可用,則調用.fetchone()返回None。你可以使用它。

checkSql = 'SELECT userid FROM bs_members WHERE userid = :checkUser' 
while True: 
    newUser.userID = ga.getInput('Enter userID: ', "\w+$") 
    ds.execute(checkSql,checkUser=newUser.userID) 
    if ds.fetchone() is None: 
     # This userID is available. 
     break 
    else: 
     print 'That user name is already in use. Please enter a new username.' 

我在這裏假設dsCursor的實例,或者它們的子類。

+0

+ +1爲一個很好的答案,並使該功能看起來很整齊。 –

+0

這就是答案。謝謝你犛牛。發生這種情況是因爲我假定'execute'方法正在返回一個值,而不是。我需要按照我的假設工作。 – mnky9800n

0

至少你應該在while循環的開始處有行doesUserExist = False。否則,如果用戶輸入一個現有的ID,那麼它將永遠循環。