Skip to main content
 首页 » 编程设计

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

2025年05月04日15bjzhanghao

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

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

请您参考如下方法:

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

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

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

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