我在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)
答案 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。