我有一个 SQLAlchemy 设置,其中我的一个模型没有存储在数据库中。数据来自 Web 服务,而其他模型只存储一个主键来引用它。
如何在仍然使用 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)
我想从我的数据库中删除用户模型并仅从 Web 服务中检索它(这很简单),同时仍然保留 SQLAlchemy 提供的双向关系的好处(Document. user
和 User.documents
)。
我如何实现后者?
最佳答案
虽然已经提出了一些可能最终导致某些模型在非关系存储中持久存在的想法草图,但我们没有在这个模型上投入太多精力——但这里的努力更多地集中在工作单元方面.在查询/加载方面,您可能会使用 SQLA 的一些相对较新的功能来实现您正在寻找的一些东西 - 在 0.7 中有关系的 load_on_pending
标志(http://docs. sqlalchemy.org/en/rel_0_7/orm/relationships.html#relationships-api) 这将允许你创建一个用户对象,给它你想要的主键,将它添加到 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 时仍会使用它。
这些都是我为一个用户的利益而添加的粗略功能,不一定适合您在这里所做的事情,但如果您尝试了它们,请告诉我进展情况。
关于python - 在 SQLAlchemy 中使用非数据库支持的模型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13138185/