SqlAlchemy非持久列

时间:2018-02-28 18:30:04

标签: python sqlalchemy marshmallow

我正在尝试使用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?

中提供的属性

1 个答案:

答案 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保留到数据库中。