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.'
我在这里假设ds
是Cursor
的一个实例,或者它的子类。
至少在while循环的开始应该有doesUserExist = False
行。否则,如果用户输入一个已存在的ID,那么它将永远循环下去。