2011-11-12 12 views
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_OracleモジュールをPython 2.7で使用しています。ユーザーにuserIDの入力を促すようにしています。プログラムはuserIDがすでに存在しているかどうかを確認し、別のuserIDを入力するかどうかを確認します。 executeメソッドは、cx_Oracleのexecuteメソッドを使用してOracleデータベースと対話するヘルパー・メソッドです。 getInputメソッドは、ユーザーに入力を求めるプロンプトを出し、正規表現と照合します。なぜこのループが終了するのか分かりません

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

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

def execute(self, statement, **parameters): 
    if parameters is None: 
     self._curs.execute(statement) 
    else: 
     self._curs.execute(statement,parameters) 

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

編集:私はwhileループの開始直後にdoesUserExist = Falseという行を忘れてしまったので、追加しました。

+0

現在の動作は、期待される動作からどのようにずれていますか? – Blender

+0

ええと、代わりに 'COUNT()'を使用して、結果の値をチェックするべきではありませんか? –

+0

'if doesUserExist == False:break'?ここでその論理を説明してください。 –

答えて

4

お客様のカスタム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.' 

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

+0

+1は良い答えで、機能をきれいに整えます。 –

+0

これが答えです。ヤクありがとう。これは、 'execute'メソッドが値を返すものと仮定していたために起こりました。私は私の前提に基づいて作業する必要があります。 – mnky9800n

0

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

関連する問題