0
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

cx_OraclePython2.7でモジュールを使用しています。ユーザーにユーザーIDの入力を求めようとしています。次に、プログラムはuserIDがすでに存在するかどうか、およびユーザーに別のuserIDの入力を求めるプロンプトを表示するかどうかを確認します。executeメソッドは、cx_Oracleのexecuteメソッドを使用してOracleデータベースと対話するヘルパーメソッドです。getInputメソッドは、正規表現に対してチェックされる入力の入力をユーザーに求めます。

私はこれが間違っていることを知っていますが、whileループが開始され、ユーザーがユーザーIDの入力を求められるという最初のアクションが実行されると思います。次に、userIDがデータベースに対してチェックされます。ループが開始され、によって返される行がユーザーによって提供されたuserIDと同じであるforかどうかがチェックされます。ds.execute()それがユーザーである場合、ユーザーは別のユーザー名を使用するように指示され、ループを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)

さらに情報を提供する必要がある場合はお知らせください。

編集:ループdoesUserExist = Falseの開始直後の行を忘れたので、それを追加しました。while

4

2 に答える 2

4

カスタム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.'

dsここでは、それがのインスタンスCursor、またはそのサブクラスであると想定しています。

于 2011-11-12T22:47:08.240 に答える
0

少なくともdoesUserExist = False、whileループの先頭に行が必要です。それ以外の場合、ユーザーが既存のIDを一度入力すると、永久にループし続けます。

于 2011-11-12T22:29:02.180 に答える