8

セッションを介してクエリを実行せずにマッパーのバックリファレンスを初期化するにはどうすればよいですか?たとえば、次のコードに「Client」と「Subject」という名前の2つのモデルがあります。

Base = declarative_base()

class Client(Base):
    __tablename__ = "clients"

    id = Column(Integer, primary_key=True)
    created = Column(DateTime, default=datetime.datetime.now)
    name = Column(String)

    subjects = relationship("Subject",  cascade="all,delete",
        backref=backref("client"))


class Subject(Base):
    __tablename__ = "subjects"

    id = Column(Integer, primary_key=True)
    client_id = Column(Integer, ForeignKey(Client.id, ondelete='CASCADE'))

client次に、コードのどこかで、このようなクラスのバックリファレンスを取得したいのですSubjectが、例外が発生します。

>>> Subject.client
AttributeError: type object 'Subject' has no attribute 'client'

好きなクエリの後Client

>>> session.query(Client).first()
>>> Subject.client
<sqlalchemy.orm.attributes.InstrumentedAttribute at 0x43ca1d0>

属性clientは、関連するモデル(マッパー)へのクエリの後に作成されました。
私はそのような「暖かい」クエリをしたくありません!

4

2 に答える 2

12

または、次を使用できます。

from sqlalchemy.orm import configure_mappers

configure_mappers()

これには、すべてのモデルのすべての後方参照を 1 ステップで作成できるという利点があります。

于 2013-02-17T14:48:03.387 に答える
6

SQLAlchemy はメタクラスを使用するため、他のクラスで後方参照を作成するコードは、クラスのインスタンスを少なくとも1 つ作成するまで実行されませんClient

解決策は簡単です:Client()インスタンスを作成し、もう一度破棄します:

>>> Subject.client
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: type object 'Subject' has no attribute 'client'
>>> Client()
<__main__.Client object at 0x104bdc690>
>>> Subject.client
<sqlalchemy.orm.attributes.InstrumentedAttribute object at 0x104be9e10>

またはconfigure_mappersユーティリティ関数を使用します。

from sqlalchemy.orm import configure_mappers

モデルをスキャンしてそのような参照を探し、初期化します。実際には、1 つのインスタンスを作成すると、内部でこのメソッドが呼び出されます。

于 2013-02-17T14:05:54.323 に答える