小编Jef*_*eck的帖子

SQLAlchemy - 如何映射只读(或计算)属性

我正在试图弄清楚如何映射一个简单的只读属性,并在我保存到数据库时触发该属性.

一个人为的例子应该让这个更清楚.首先,一个简单的表:

meta = MetaData()
foo_table = Table('foo', meta,
    Column('id', String(3), primary_key=True),
    Column('description', String(64), nullable=False),
    Column('calculated_value', Integer, nullable=False),
    )
Run Code Online (Sandbox Code Playgroud)

我想要做的是设置一个具有只读属性的类,当我调用session.commit()时,该属性将插入到calculated_value列中...

import datetime
def Foo(object):  
    def __init__(self, id, description):
        self.id = id
        self.description = description

    @property
    def calculated_value(self):
        self._calculated_value = datetime.datetime.now().second + 10
        return self._calculated_value
Run Code Online (Sandbox Code Playgroud)

根据sqlalchemy文档,我认为我应该这样映射:

mapper(Foo, foo_table, properties = {
    'calculated_value' : synonym('_calculated_value', map_column=True)
    })
Run Code Online (Sandbox Code Playgroud)

这样做的问题是,在您访问calculated_value属性之前,_calculated_value为None.似乎SQLAlchemy在插入数据库时​​没有调用该属性,所以我得到一个None值.映射这个的正确方法是什么,以便将"calculated_value"属性的结果插入到foo表的"calculated_value"列中?

好的 - 我正在编辑这篇文章以防其他人有同样的问题.我最终做的是使用MapperExtension.让我给你一个更好的例子以及扩展的用法:

class UpdatePropertiesExtension(MapperExtension):
    def __init__(self, properties):
        self.properties = properties

    def _update_properties(self, instance):
        # We simply need to access our …
Run Code Online (Sandbox Code Playgroud)

python sqlalchemy properties readonly

6
推荐指数
2
解决办法
4469
查看次数

标签 统计

properties ×1

python ×1

readonly ×1

sqlalchemy ×1