使用SQLalchemy获取对象时,“method”对象不支持在某些项上显示项分配,但在其他项上不显示项分配

2024-10-04 05:27:02 发布

您现在位置:Python中文网/ 问答频道 /正文

我在炼金术中有一个Store对象:

class Store(db.Model):
    __tablename__ = "store"

    _key = db.Column(db.String(), primary_key=True)
    _value = db.Column(db.PickleType())

我编写了一个实用程序,允许我将其作为简单的键值存储进行写入和检索:

def get_store(key, as_obj=False):
    item = Store.query.filter(Store._key == key).first()
    if item:
        if as_obj:
            return item
        else:
            return item._value
    else:
        return False


def create_store(key, value):
    already = get_store(key, as_obj=True)
    if already:
        already._value = value
        db.session.commit()
        return already._value
    else:
        item = Store(_key=key, _value=value)
        db.session.add(item)
        db.session.commit()
        db.session.refresh(item)
    return item._value

当我用create_store()get_store()创建一个对象时,我基本上没有问题,但是有两个键-大体上与其他所有键完全相同-它们为TypeError: 'method' object does not support item assignment提供了完整的回溯,如下所示。我应该补充一点,它们的关键结构是“tweets:namespace”。如果我搜索一个而不是的键,那么它的行为与我预期的一样。如果我搜索一个存在的键,它的行为基本上和我预期的一样,例如“tweets:myusername”就可以工作。但是,当我搜索以下内容时,它不起作用

更多信息: 查看PGadmin-我可以发现有问题的Store._key对象没有问题,我的所有其他对象都在我希望找到它们的DB中。这似乎是炼金术的问题

~/zask/shell.py in <module>
----> 1 thing = Store.query.filter(Store._key == "tweets:ChartAlertsIO").first()

~/.cache/pypoetry/virtualenvs/zask-vOGOH6lJ-py3.8/lib/python3.8/site-packages/sqlalchemy/orm/query.py in first(self)
   3427             ret = list(self)[0:1]
   3428         else:
-> 3429             ret = list(self[0:1])
   3430         if len(ret) > 0:
   3431             return ret[0]

~/.cache/pypoetry/virtualenvs/zask-vOGOH6lJ-py3.8/lib/python3.8/site-packages/sqlalchemy/orm/query.py in __getitem__(self, item)
   3201                 return list(res)[None : None : item.step]
   3202             else:
-> 3203                 return list(res)
   3204         else:
   3205             if item == -1:

~/.cache/pypoetry/virtualenvs/zask-vOGOH6lJ-py3.8/lib/python3.8/site-packages/sqlalchemy/orm/loading.py in instances(query, cursor, context)
     98     except Exception:
     99         with util.safe_reraise():
--> 100             cursor.close()
    101 
    102 

~/.cache/pypoetry/virtualenvs/zask-vOGOH6lJ-py3.8/lib/python3.8/site-packages/sqlalchemy/util/langhelpers.py in __exit__(self, type_, value, traceback)
     66             self._exc_info = None  # remove potential circular references
     67             if not self.warn_only:
---> 68                 compat.raise_(
     69                     exc_value,
     70                     with_traceback=exc_tb,

~/.cache/pypoetry/virtualenvs/zask-vOGOH6lJ-py3.8/lib/python3.8/site-packages/sqlalchemy/util/compat.py in raise_(***failed resolving arguments***)
    180 
    181         try:
--> 182             raise exception
    183         finally:
    184             # credit to

~/.cache/pypoetry/virtualenvs/zask-vOGOH6lJ-py3.8/lib/python3.8/site-packages/sqlalchemy/orm/loading.py in instances(query, cursor, context)
     78             if single_entity:
     79                 proc = process[0]
---> 80                 rows = [proc(row) for row in fetch]
     81             else:
     82                 rows = [

~/.cache/pypoetry/virtualenvs/zask-vOGOH6lJ-py3.8/lib/python3.8/site-packages/sqlalchemy/orm/loading.py in <listcomp>(.0)
     78             if single_entity:
     79                 proc = process[0]
---> 80                 rows = [proc(row) for row in fetch]
     81             else:
     82                 rows = [

~/.cache/pypoetry/virtualenvs/zask-vOGOH6lJ-py3.8/lib/python3.8/site-packages/sqlalchemy/orm/loading.py in _instance(row)
    634                 # and add to the "context.partials" collection.
    635 
--> 636                 to_load = _populate_partial(
    637                     context,
    638                     row,

~/.cache/pypoetry/virtualenvs/zask-vOGOH6lJ-py3.8/lib/python3.8/site-packages/sqlalchemy/orm/loading.py in _populate_partial(context, row, state, dict_, isnew, load_path, unloaded, populators)
    780         for key, getter in populators["quick"]:
    781             if key in to_load:
--> 782                 dict_[key] = getter(row)
    783         for key, set_callable in populators["expire"]:
    784             if key in to_load:

~/.cache/pypoetry/virtualenvs/zask-vOGOH6lJ-py3.8/lib/python3.8/site-packages/sqlalchemy/sql/sqltypes.py in process(value)
   1721                 if value is None:
   1722                     return None
-> 1723                 return loads(value)
   1724 
   1725         else:


我想继续使用我的简单Postgres对象键/值存储,有人看到哪里出了问题吗


Tags: keyinpycachereturnifvaluelib