我不明白为什么这个循环终止它的方式

时间:2011-11-12 22:17:10

标签: python loops cx-oracle

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。然后,程序将检查userID是否已存在,以及是否确实提示用户输入其他用户ID。 execute方法是一个辅助方法,它使用cx_Oracle中的execute方法与Oracle数据库进行交互。 getInput方法提示用户输入,然后根据正则表达式检查。

我知道我有这个错误,但我相信while循环启动第一个操作是提示用户输入userID。然后针对数据库检查userID。 for循环启动并检查ds.execute()返回的行是否与用户提供的用户ID相同。如果是,则告知用户使用其他用户名,break退出for循环。然后if语句检查用户是否存在,如果不存在,则会中断while循环。如果没有,则while循环迭代,以提示用户输入不存在的用户ID。

如果用户被提示输入用户ID,那么用户就不会发生任何检查,并且程序会转到下一段代码。我在这里错过了什么?我在execute()的文档中添加了link。上面代码中的execute方法是以下helper方法的一部分:

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

如果我需要提供更多信息,请告诉我。

编辑:我在doesUserExist = False循环开始后立即忘记了行while,所以我添加了。{/ p>

2 个答案:

答案 0 :(得分:4)

您的自定义execute方法不会返回任何意味着您的代码中checkUserID将为None的内容。

此外,您感兴趣的是查询返回的行至少是一行。如果没有,那么userID应该可用。

文档说如果没有更多行可用,则调用.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的实例或其子类。

答案 1 :(得分:0)

至少你应该在while循环的开头有行doesUserExist = False。否则,如果用户输入一次现有ID,那么它将永远循环。

相关问题