在SQLAlchemy中使用非数据库支持的模型

时间:2012-10-30 11:37:55

标签: python sqlalchemy

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

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

我如何实现后者?

1 个答案:

答案 0 :(得分:1)

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

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