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

我正在使用cx_Oracle带有 Python 2.7 的模块。我正在尝试提示用户输入用户 ID。然后程序将检查用户 ID 是否已经存在以及是否提示用户输入不同的用户 ID。execute 方法是一个辅助方法,它使用 cx_Oracle 中的 execute 方法与 Oracle 数据库进行交互。getInput 方法提示用户输入,然后根据正则表达式进行检查。

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

发生的情况是提示用户输入用户 ID,然后用户似乎没有进行任何检查,程序继续执行下一段代码。我在这里想念什么?我已经包含了一个指向文档的链接execute()。上述代码中的 execute 方法是以下辅助方法的一部分:

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

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

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

4

2 回答 2

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.'

我在这里假设它ds是 的一个实例Cursor,或者它的子类。

于 2011-11-12T22:47:08.240 回答
0

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

于 2011-11-12T22:29:02.180 回答