2

モデルの 1 つがデータベースに保存されていない 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)

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) を使用すると、User オブジェクトを作成し、必要な主キーを与え、それをセッションに add() してから、フラッシュせずに.documentsコレクションは負荷を発する必要があります。0.8 では、enable_relationship_loading (http://docs.sqlalchemy.org/en/latest/orm/session.html#sqlalchemy.orm.session.Session.enable_relationship_loading) メソッドというより良い解決策があります。このメソッドを使用して User オブジェクトをアタッチすると、オブジェクトはセッションから切り離されたままになりますが、user.documents を呼び出すときに引き続き使用されます。

これらはどちらも 1 人のユーザーのために追加した大まかな機能であり、ここで行っていることに必ずしも合わせたものではありませんが、試してみたらどうなるか教えてください。

于 2012-10-31T02:45:18.807 に答える