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


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模块。我正在尝试提示用户输入userID。然后,程序将检查userID是否已经存在,如果确实存在,则提示用户输入不同的userID。execute方法是一个helper方法,它使用来自cx_Oracle的execute方法与Oracle数据库进行交互。getInput方法提示用户输入,然后根据正则表达式检查输入。

我知道我有这个错误,但我相信while循环开始采取的第一个动作是提示用户输入userID。然后根据数据库检查userID。for循环启动,检查ds.execute()返回的行是否与用户提供的userID相同。如果是,则用户被告知使用另一个用户名,并且break退出for循环。然后,if语句检查用户是否存在,如果不存在,则打破while循环。如果没有,则while循环迭代,提示用户输入一个不存在的userID。

会提示用户输入userID,然后似乎没有任何检查发生在用户身上,程序继续执行下一段代码。我遗漏了什么?我已经包含了execute()文档的链接。上面代码中的execute方法是以下helper方法的一部分:

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

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

编辑:我忘记了while循环开始后的doesUserExist = False行,所以我添加了它。

您的自定义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的一个实例,或者它的子类。

至少在while循环的开始应该有doesUserExist = False行。否则,如果用户输入一个已存在的ID,那么它将永远循环下去。

最新更新