Python 我不知道';我不明白为什么这个循环会以这种方式终止
我正在使用Python 2.7中的Python 我不知道';我不明白为什么这个循环会以这种方式终止,python,loops,cx-oracle,Python,Loops,Cx Oracle,我正在使用Python 2.7中的cx\u Oracle模块。我试图提示用户输入用户ID。然后程序将检查用户ID是否已经存在,以及是否提示用户输入其他用户ID。execute方法是一种辅助方法,它使用cx_Oracle中的execute方法与Oracle数据库交互。getInput方法提示用户输入,然后根据正则表达式检查输入 我知道这是错误的,但我相信当循环启动时,所采取的第一个操作是提示用户输入用户ID。然后根据数据库检查用户ID。for循环启动并检查由ds.execute()返回的行是否与用
cx\u Oracle
模块。我试图提示用户输入用户ID。然后程序将检查用户ID是否已经存在,以及是否提示用户输入其他用户ID。execute方法是一种辅助方法,它使用cx_Oracle中的execute方法与Oracle数据库交互。getInput方法提示用户输入,然后根据正则表达式检查输入
我知道这是错误的,但我相信当循环启动时,所采取的第一个操作是提示用户输入用户ID。然后根据数据库检查用户ID。for
循环启动并检查由ds.execute()
返回的行是否与用户提供的userID相同。如果用户被告知使用另一个用户名,则中断
退出for
循环。if
语句然后检查用户是否存在,如果不存在,则在循环时中断。如果不是,则while
循环将迭代,因此提示用户输入一个不存在的userID
发生的情况是提示用户输入userID,然后所有检查都不会发生在用户身上,程序将继续执行下一段代码。我错过了什么?我在文档中添加了一个用于execute()
。上述代码中的execute方法是以下helper方法的一部分:
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
如果我需要提供更多信息,请告诉我
编辑:我忘记了while
循环开始后立即出现的行doesUserExist=False
,因此我添加了该行。至少在while循环开始时应该有行doesUserExist=False
。否则,如果用户只输入一次现有ID,它将永远保持循环。至少在while循环的开头应该有一行doesUserExist=False
。否则,如果用户只输入一次现有ID,它将永远保持循环。您的自定义execute
方法不会返回任何表示代码中的checkUserID
将为None
此外,您感兴趣的是查询是否至少返回一行。如果没有,那么userID应该是可用的
文档说,如果没有更多行可用,调用.fetchone()
将返回None
。你可以用这个
def execute(self, statement, **parameters):
if parameters is None:
self._curs.execute(statement)
else:
self._curs.execute(statement,parameters)
这里我假设ds
是Cursor
或其子类的一个实例。您的自定义execute
方法不会返回任何表示代码中的checkUserID
将为None
此外,您感兴趣的是查询是否至少返回一行。如果没有,那么userID应该是可用的
文档说,如果没有更多行可用,调用.fetchone()
将返回None
。你可以用这个
def execute(self, statement, **parameters):
if parameters is None:
self._curs.execute(statement)
else:
self._curs.execute(statement,parameters)
我在这里假设ds
是Cursor
或其子类的一个实例。当前行为与您预期的行为有何偏差?嗯,您不应该只使用COUNT()
并检查结果值吗?如果doesUserExist==False:break
?请在这里解释逻辑。@Lasse:while应该循环,直到给出未使用的用户ID为止。if语句是此时循环的退出条件。在“break”命令下,执行跳出“while”循环。那么,如果用户输入一个正在使用的用户名,在哪一点它会返回到false?当前行为如何偏离您的预期行为?嗯,您不应该只使用COUNT()
而是检查结果值?如果doesUserExist==False:break
?请在这里解释逻辑。@Lasse:while应该循环,直到给出未使用的用户ID为止。if语句是此时循环的退出条件。在“break”命令下,执行跳出“while”循环。因此,如果用户输入一个正在使用的用户名,那么在哪一点它会返回到false?+1以获得一个好的答案,并使函数看起来非常整洁。这就是答案。谢谢你,牦牛。发生这种情况是因为我假设execute
方法返回了一个值,但它没有返回。我需要在我的假设下工作。+1是一个好的答案,使函数看起来很整洁。这就是答案。谢谢你,牦牛。发生这种情况是因为我假设execute
方法返回了一个值,但它没有返回。我需要根据我的假设工作。