2

我有一个 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)

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

我如何实现后者?

4

1 回答 1

1

尽管已经提出了一些想法的草图,但我们并没有在这个模型上投入太多精力,最终可能导致一些模型在非关系存储中持续存在——但这里的工作更多的是在工作单元方面。在查询/加载方面,您也许可以使用 SQLA 的一些相对较新的功能来实现您正在寻找的一些东西 - 在 0.7 中有load_on_pending关系标志(http://docs.sqlalchemy.org/en/rel_0_7/ orm/relationships.html#relationships-api) 这将允许你创建一个用户对象,给它你想要的主键,将它添加()到一个会话,然后没有任何刷新.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 时仍会使用它。

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

于 2012-10-31T02:45:18.807 回答