【问题标题】:Using non-database-backed models in SQLAlchemy在 SQLAlchemy 中使用非数据库支持的模型
【发布时间】:2012-10-31 10:45:18
【问题描述】:

我有一个 SQLAlchemy 设置,其中我的一个模型未存储在数据库中。数据来自网络服务,而其他模型只存储一个主键来引用它。

如何在仍然使用 SQLAlchemy 关系的同时完成这项工作?我现在正在本地将数据缓存在数据库中,并在发生变化时从 Web 服务进行更新,但这意味着我正在存储数据的冗余副本。我根本不想在本地存储。考虑一下:

Base = declarative_base()

# Web service-backed model
class User(Base):
    __tablename__ = 'user'
    id = Column(Integer, primary_key=True)
    username = Column(Unicode(20), nullable=False)

    @classmethod
    def get(cls, id):
        """Get an instance using data from the web service."""
        pass

# Local model
class Document(Base):
    __tablename__ = 'document'
    id = Column(Integer, primary_key=True)
    user_id = Column(Integer, ForeignKey('user.id'))
    user = relationship(User, backref='documents')
    content = Column(UnicodeText)

我想从我的数据库中删除 User 模型并仅从 Web 服务中检索它(这很简单),同时仍然保留 SQLAlchemy 提供的双向关系的好处(Document.user 和 @ 987654323@)。

如何实现后者?

【问题讨论】:

    标签: python sqlalchemy


    【解决方案1】:

    我们并没有在这个模型上投入太多精力,尽管已经提出了一些想法的草图,最终可能导致一些模型在非关系存储中持续存在 - 但这里的工作更多的是在工作单元方面.在查询/加载方面,您可以使用 SQLA 的一些相对较新的功能来实现您正在寻找的一些功能 - 在 0.7 中有 load_on_pending 关系标志(http://docs.sqlalchemy.org/en /rel_0_7/orm/relationships.html#relationships-api) 这将允许您创建一个 User 对象,为其提供所需的主键,将其添加()到 Session 中,然后无需任何刷新 .documents 集合应该发出负载;在 0.8 中有更好的解决方案 enable_relationship_loading (http://docs.sqlalchemy.org/en/latest/orm/session.html#sqlalchemy.orm.session.Session.enable_relationship_loading) 方法,如果您使用此方法附加用户对象对象将与 Session 保持分离,但在您调用 user.documents 时仍会使用它。

    这些都是我为了一个用户的利益而添加的粗略功能,不一定适合你在这里所做的事情,但如果你尝试了它们,请告诉我它是怎么回事。

    【讨论】:

    • 谢谢。我在 11 月份有一些空闲时间,我会讨论这个。
    猜你喜欢
    • 1970-01-01
    • 2011-03-28
    • 1970-01-01
    • 2012-03-07
    • 2015-08-18
    • 1970-01-01
    • 2018-01-22
    • 2013-05-27
    相关资源
    最近更新 更多