Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 我不知道';我不明白为什么这个循环会以这种方式终止_Python_Loops_Cx Oracle - Fatal编程技术网

Python 我不知道';我不明白为什么这个循环会以这种方式终止

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()返回的行是否与用

我正在使用Python 2.7中的
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
方法返回了一个值,但它没有返回。我需要根据我的假设工作。