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

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 ユーザーに別のユーザー名を使用するよう指示されている場合、 breakfor ループを終了します。 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 という行を忘れてしまいました。

0
if doesUserExist == False:break ?ここでその論理を説明してください。
追加された 著者 Lasse Vågsæther Karl,
したがって、ユーザが使用中のユーザ名を入力すると、その時点で偽に戻ってしまいますか?
追加された 著者 Lasse Vågsæther Karl,
現在の行動があなたの期待される行動からどのように逸脱していますか?
追加された 著者 Blender,
代わりに COUNT()を使用して結果の値を確認してください。
追加された 著者 Ignacio Vazquez-Abrams,
@Lasse: "while"は未使用のユーザIDが与えられるまでループします。 if文は現時点でのループの終了条件です。 "break"コマンドでは、実行は "while"ループから飛び出します。
追加された 著者 Jarno Argillander,
決して、私はその答えを投稿しました。
追加された 著者 Jarno Argillander,
@ IgnacioVazquez-Abrams:それでも問題は解決しません。問題は、実行(...)が何を返しても、ループが終了していることです。したがって、ユーザーが既に存在するuserIDを入力すると、ループは終了します。
追加された 著者 mnky9800n,
@Blender:期待される振る舞いは次の通りです。ユーザーが既存のuserIDを入力すると、プログラムは叫び、別のuserIDを選択する必要があります。現在の動作は次のとおりです。ユーザーIDが選択されていても、プログラムはループを終了して処理を続行します。
追加された 著者 mnky9800n,

2 答え

独自の execute メソッドは、コード内の checkUserIDNone であることを意味するものを返しません。

さらに、クエリで返された行が少なくとも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 のインスタンスまたはそのサブクラスであると仮定しています。

4
追加された
+1は良い答えであり、機能をきれいに整えます。
追加された 著者 Jarno Argillander,
これが答えです。ヤクありがとう。これは、 execute メソッドが値を戻していると仮定していたためではありませんでした。私は私の前提に基づいて作業する必要があります。
追加された 著者 mnky9800n,

少なくともwhileループの先頭に doesUserExist = False という行を付ける必要があります。それ以外の場合、ユーザーが既存のIDを1回入力すると、それは永遠にループし続けます。

0
追加された