2011-11-12 29 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,那么它将永远循环。

相关问题