在更新之前,我需要检查项目是否在数据存储区中。
我有2个列表:UNIQUES = ["B","K","V"]
和COUNTS = [5, 10, 3]
这是模型:
class Rep(db.Model):
mAUTHOR = db.UserProperty(auto_current_user=True)
mUNIQUE = db.TextProperty()
mCOUNT = db.IntegerProperty()
mDATE = db.DateTimeProperty(auto_now_add=True)
此功能更新数据库:
def write_to_db(S, C):
REP = Rep(mUNIQUE=S, mCOUNT=C)
db.put(REP)
受此page启发,我尝试:
for i in range(len(UNIQUES)):
C_QUERY = Rep.all()
C_QUERY.filter("mAUTHOR =", user)
C_QUERY.filter("mUNIQUE =", UNIQUES[i])
C_RESULT = C_QUERY.fetch(1)
if C_RESULT:
C = C_RESULT.mCOUNT + COUNTS[i]
S = db.Text(UNIQUES[i])
write_to_db(S,C)
else:
C = COUNTS[i]
S = UNIQUES[i]
write_to_db(S, C)
但结果不是我所期望的。 C_RESULT总是空的;而不是更新,创建一个新记录。我究竟做错了什么?谢谢!
EDIT3:问题已解决
根据David Underhill的评论,我更新了代码,现在可以使用了。
if C_RESULT:
rep=C_RESULT[0]
rep.mCOUNT+=COUNTS[i]
rep.put()
EDIT2:相关问题
如何更新此查询并将其与最新信息一起更换?
C_QUERY = Rep.all()
C_QUERY.filter("mAUTHOR =", user)
C_QUERY.filter("mUNIQUE =", UNIQUES[i])
C_RESULT = C_QUERY.fetch(1)
我想更改mCOUNT,然后将其写入数据存储区。我怎么这样?这与他们在this page中所做的完全相同,但我无法使其发挥作用。谢谢你的帮助。
修改
我根据David Underhill的回答更新了代码。这解决了问题(但功能不正确。我不确定这是否应该是一个不同的问题。)
for i in range(len(UNIQUES)):
C_QUERY = Rep.all()
C_QUERY.filter("mAUTHOR =", user)
C_QUERY.filter("mUNIQUE =", UNIQUES[i])
C_RESULT = C_QUERY.fetch(1)
if C_RESULT:
C = C_RESULT[0].mCOUNT + COUNTS[i]
S = UNIQUES[i]
write_to_db(S, C)
else:
C = COUNTS[i]
S = UNIQUES[i]
write_to_db(S, C)
答案 0 :(得分:1)
问题是该查询正在尝试过滤mUNIQUE
。但是,您将mUNIQUE
声明为db.TextProperty
从未编入索引。因此,您查询永远不会找到任何结果。
解决方案:将mUNIQUE
更改为db.StringProperty
(默认情况下 已编入索引)。
您还应考虑更新transaction中的Rep
- 如果两个请求尝试同时更新同一实体,则当前代码可能无法添加COUNTS[i]
属性。
此外,您可以将S = db.Text(UNIQUES[i])
更新为S = UNIQUES[i]
。