如何更新数据存储区中的信息?

时间:2010-11-07 17:16:02

标签: python google-app-engine google-cloud-datastore

在更新之前,我需要检查项目是否在数据存储区中。

我有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)

1 个答案:

答案 0 :(得分:1)

问题是该查询正在尝试过滤mUNIQUE。但是,您将mUNIQUE声明为db.TextProperty 从未编入索引。因此,您查询永远不会找到任何结果。

解决方案:将mUNIQUE更改为db.StringProperty(默认情况下 已编入索引)。

您还应考虑更新transaction中的Rep - 如果两个请求尝试同时更新同一实体,则当前代码可能无法添加COUNTS[i]属性。

此外,您可以将S = db.Text(UNIQUES[i])更新为S = UNIQUES[i]