なぜこのループが終了するのかわかりません

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メソッドは、cx_Oracleのexecuteメソッドを使用してOracleデータベースと対話するヘルパー・メソッドです。
getInputメソッドは、ユーザーに入力を求めるプロンプトを出し、正規表現と照合します。

私はこれが間違っていることを知っているが、私は while
ループが最初のアクションを開始すると信じている。次に、ユーザーIDがデータベースに対してチェックされます。
ds.execute()によって返された行が、ユーザーによって提供されたユーザーIDと同じであるかどうかを確認するために、
for ユーザーに別のユーザー名を使用するよう指示されている場合、 break
for ループを終了します。 if
ステートメントは、ユーザーが存在するかどうかをチェックし、存在しない場合は while
ループを壊します。そうでなければ、 while
ループが反復して、ユーザーは存在しないuserIDを入力するように求められます。

何が起こるかは、ユーザーにuserIDの入力を求められた場合、ユーザーにチェックが行われていないと思われ、プログラムは次のコードに移動します。私はここで何が欠けていますか?私は
executeのためにドキュメントにリンクを含めました()上記のコードのexecuteメソッドは、次のヘルパーメソッドの一部です。

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 であることを意味するものを返しません。

さらに、クエリで返された行が少なくとも1つあれば、興味があります。何もない場合は、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.'

ここでは、 dsCursor
のインスタンスまたはそのサブクラスであると仮定しています。

コメントする

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です