2009-08-06 3 views
2

파이썬 파일에서이 작업을 수행했으나 내 레코드가 DB에서 삭제되지 않았습니다. 내 DB는 Google App Engine에 있습니다. 이 쿼리에 대한 레코드는 하나뿐입니다. 어떤 해결책?Google App Engine 테이블의 레코드 삭제

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

답변

6

반환되는 레코드가 하나뿐이기 때문에 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)는 결과가 false 인 경우 예외를 throw합니다. 없음. 그것을 검사하거나 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') 

만 더 효율적입니다 데이터 저장소에서 키를 검색 결과에 다른 작업을 수행하지 않는 때문에. 여기서 한 가지 결과 만 얻었으니 큰 문제는 아니지만 나중에 데이터 스토어에서 많은 수의 항목을 삭제해야하는 경우주의해야 할 사항입니다.

하나의 레코드 만 필요하므로 deleteContact.get()을 호출하면 레코드 하나만 검색되지만 일치하는 엔티티가 없으면 None을 반환합니다. None을 전달하면 db.delete()가 BadArgumentError를 던질 것이므로 테스트 해보십시오.

또는 db.delete()에 전달할 일치하는 엔티티가없는 경우 deleteContact.fetch (1)는 빈 목록을 반환합니다. 그러나 엔티티가 실제로 발견되었는지 확인하려면 fetch()에서 얻은 목록의 길이가 0인지 확인해야합니다.