我正在尝试使用sqlalchemy定义一个模型,这样我只需要在内存中进行处理的一列,我没有相应的数据库列。我需要它,以便当我保存内存对象时,它不应该尝试持久保存该特殊列。
更多上下文:我使用python marshmallow库将json对象映射到sql炼金术对象。在json响应中,我有其他字段,我不需要在数据库中,但需要在内存中进行计算。
我搜索了sqlalchemy文档,但找不到跳过某些列的持久性的方法。
class AdSchema(Schema):
"""Schema Mapping class."""
id = fields.Int(dump_only=True)
available_formats = fields.List(fields.Str())
@post_load
def make_ad(self, data):
return AdModel(**data)
class AdModel(Base):
"""Ad ORM class."""
__tablename__ = 'ad_model'
id = Column(Integer, primary_key=True)
我在这里错过了什么吗?
我基本上寻找的是一个虚拟的"属性,类似于Rails ORM How to add a virtual attribute to a model in Ruby on Rails?
中提供的属性答案 0 :(得分:1)
通过执行以下操作,我可以解决此问题:
class MyModel(Base):
__tablename__ = 'my_model'
id = Column(Integer, primary_key=True)
def __init__(self, **kwargs):
self.non_persisted_column = kwargs['non_persisted_column']
kwargs.pop('non_peristed_column')
super().__init__(kwargs)
有效地,将类属性non_persisted_column
添加到__init__
方法中的类中。然后,在将non_persisted_column
传递到SQLAlchemy kwargs
超类的kwargs
方法之前,从Base
中删除__init__
,因此SQLAlchemy不会引发错误,也不会将non_persisted_column
保留到数据库中。