2009-08-06 22 views

答えて

6

1つのレコードしか返されないので、forループは必要ありませんが、停止してはいけません。 1レコードしか取得しない場合は、get()コールを使用できます。リストをdb.delete()コールに渡すと、レコードを一括で削除することもできます。例えば

db.delete(results)

for result in results: 
    db.delete(result) 

と同じしかし、戻ってあなたのコードにあります。以下のコードは、1つのレコードを削除する必要があります

deleteContact = db.GqlQuery("SELECT * FROM FriendList WHERE myNum = :1 AND friendNum = :2", myId,friendId) 
result = deleteContact.get() 
db.delete(result) 

はそう、あなたがそれを行うことを期待やって選択することを確認する必要があり返さ動作するはずです。

+1

db.delete(result)なし。それをチェックするか、fetch()を使用する必要があります。一致するエンティティが見つからない場合は空のリストを返します。 –

2

問題のコードはうまくいくように見えます。 selectステートメントと一致するFriendListエンティティがデータストアに実際に存在することを再度確認します。

ヒント:

deleteContact = db.GqlQuery("SELECT __key__ FROM FriendList WHERE myNum = :1 AND friendNum = :2", myId,friendId) 
result = deleteContact.get() 
if result is not None: 
    db.delete(result) 
else: 
    logging.error('result was None') 

あなただけのデータストアから鍵を取り出し、結果を何も行っていないので、より効率的になります。 1つの結果しか得られていないのでここでは大したことではありませんが、後にデータストアから多数のエンティティを削除する必要がある場合は注意が必要です。

1つのレコードだけが必要なので、deleteContact.get()を呼び出すと1つしか取得されませんが、一致するエンティティがない場合はNoneを返します。 Noneを渡すと、db.delete()はBadArgumentErrorをスローしますので、テストしてください。

また、deleteContact.fetch(1)は、一致するエンティティがない場合は空のリストを返します。これは、db.delete()に渡すと問題ありません。しかし、エンティティが実際に見つかったかどうかを確認したい場合は、fetch()から取得したリストの長さが0でないことを確認する必要があります。

関連する問題