【问题标题】:SqlAlchemy non persistent columnSqlAlchemy 非持久列
【发布时间】:2018-08-08 17:28:49
【问题描述】:

我正在尝试使用 sqlalchemy 定义一个模型,这样我只需要在内存中进行处理的列之一,我没有相应的数据库列。我需要这样,当我保存内存对象时,它不应该尝试保留该特殊列。

更多上下文:我正在使用 python marshmallow 库将 json 对象映射到 sql alchemy 对象。在 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? 中可用的属性@

【问题讨论】:

标签: python sqlalchemy marshmallow


【解决方案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__ 方法中的类中。然后,在将kwargs 传递到SQLAlchemy 的Base 超类的__init__ 方法之前,将non_persisted_columnkwargs 中删除,因此SQLAlchemy 不会引发错误,也不会将non_persisted_column 持久化到数据库中。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-02-17
    • 1970-01-01
    • 2017-07-12
    • 1970-01-01
    • 2023-03-24
    • 1970-01-01
    • 2019-05-26
    • 2014-05-18
    相关资源
    最近更新 更多