2009-08-06 5 views
2

Je l'ai fait dans un fichier python, mais mes enregistrements ne sont pas supprimés de DB. Ma base de données est sur le moteur Google App. Il n'y aura qu'un seul enregistrement par rapport à cette requête. Toute solution?Supprimer l'enregistrement de la table 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) 

Répondre

6

Comme il n'y a que 1 enregistrement étant retourné vous ne avez pas besoin de la boucle, mais cela ne devrait pas l'arrêter. Si vous n'avez besoin que d'un enregistrement, vous pouvez utiliser l'appel get(). Vous pouvez également supprimer en bloc des enregistrements si vous transmettez la liste dans l'appel db.delete(). par exemple.

db.delete(results) est le même que

for result in results: 
    db.delete(result) 

Mais revenons à votre code. Le code ci-dessous devrait fonctionner

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

Cela devrait supprimer le 1 enregistrement retourné vous pouvez donc vouloir vérifier que vous sélectionnez est en train de faire ce que vous attendez qu'il fasse.

+1

db.delete (résultat) lèvera une exception si le résultat est Aucun. Besoin de vérifier ou d'utiliser fetch() - qui renvoie une liste vide plutôt que none si aucune entité correspondante n'est trouvée –

2

Le code de la question semble devoir fonctionner. Vérifiez qu'une entité FriendList correspondant à l'instruction select existe réellement dans le magasin de données.

Quelques suggestions:

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') 

Puisque vous ne faites rien d'autre avec les résultats, seulement récupérer les clés du magasin de données sera plus efficace. Ce n'est pas un gros problème ici puisque vous n'obtenez qu'un seul résultat, mais c'est quelque chose à savoir si vous devez par la suite supprimer un grand nombre d'entités du magasin de données.

Étant donné que vous n'avez besoin que d'un seul enregistrement, l'appel de deleteContact.get() n'en récupèrera qu'un, mais il retournera None s'il n'y a pas d'entité correspondante. db.delete() lancera BadArgumentError si vous le transmettez None, alors assurez-vous de le tester. DeleteContact.fetch (1) renverra une liste vide s'il n'y a pas d'entités correspondantes, ce qui est correct pour passer à db.delete(). Mais si vous voulez vous assurer qu'une entité a effectivement été trouvée, vous devez vous assurer que la liste obtenue de fetch() n'a pas une longueur de 0.