从Google App Engine表中删除记录

时间:2009-08-06 10:28:41

标签: google-app-engine

我在python文件中完成了这个,但我的记录不会从DB中删除。我的数据库是Google App引擎。此查询只有一条记录。任何解决方案?

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)

2 个答案:

答案 0 :(得分:6)

由于只返回了1条记录,因此您不需要for循环,但不应该停止它。如果您只需要获得1条记录,则可以使用get()调用。如果将列表传递给db.delete()调用,也可以批量删除记录。例如

db.delete(results)

相同
for result in results:
  db.delete(result)

但回到你的代码。下面的代码应该可以使用

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

这应该删除返回的1条记录,这样你可能想要检查你选择的是做你期望它做的事情。

答案 1 :(得分: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个结果,但如果你以后需要从数据存储中删除大量实体,那么需要注意这一点。

由于您只需要一条记录,因此调用deleteContact.get()只会检索一条记录,但如果没有匹配的实体,它将返回None。如果你将它传递给它,db.delete()将抛出BadArgumentError,所以一定要测试它。

或者,如果没有匹配的实体,deleteContact.fetch(1)将返回一个空列表,可以传递给db.delete()。但是如果你想确保实际找到一个实体,你需要确保你从fetch()获得的列表的长度不是0。