代码之家  ›  专栏  ›  技术社区  ›  Zeynel

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

  •  2
  • Zeynel  · 技术社区  · 15 年前

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

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

    编辑2:相关问题

    C_QUERY = Rep.all()
    C_QUERY.filter("mAUTHOR =", user)
    C_QUERY.filter("mUNIQUE =", UNIQUES[i])
    C_RESULT = C_QUERY.fetch(1)                
    

    我想更改mCOUNT,然后将其写入数据存储。我该怎么办?看起来和他们做的一模一样 this 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[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 回复  |  直到 15 年前
        1
  •  1
  •   David Underhill    15 年前

    问题是查询正在尝试筛选 mUNIQUE . 但是,你声明 穆尼克 db.TextProperty 那就是 从未 索引。因此,查询永远不会找到任何结果。

    :更改 穆尼克 db.StringProperty (其中

    你还应该考虑更新 Rep 在一个 transaction -当前代码可能无法添加属性 COUNTS[i] 如果两个请求试图同时更新同一个实体。

    此外,您还可以更新 S = db.Text(UNIQUES[i]) 简单地 S = UNIQUES[i] .