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>
答案 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.'
我假设ds
是Cursor
的实例或其子类。
答案 1 :(得分:0)
至少你应该在while循环的开头有行doesUserExist = False
。否则,如果用户输入一次现有ID,那么它将永远循环。