2016-10-07 11 views
0

単純な宣言ベースのクラスを指定すると、永続モデルのプロパティにアクセスするときにSQLAlchemyが余分なSELECTを送信する理由

class Entity(db.Model): 

    __tablename__ = 'brand' 

    id = db.Column(db.Integer, primary_key=True) 
    name = db.Column(db.String(255), nullable=False) 

し、次のスクリプト

entity = Entity() 
entity.name = 'random name' 
db.session.add(entity) 
db.session.commit() 

# Just by accessing the property name of the created object a 
# SELECT statement is sent to the database. 

print entity.name 

私はSQLAlchemyの中echoモードを有効にすると、私は(端末で、私はプロパティにアクセスするだけでINSERT文と、余分なSELECTを見ることができます列)を選択します(テーブル行)。

プロパティにアクセスしないと、クエリは作成されません。

その動作の理由は何ですか?この基本例では、すでにオブジェクトに割り当てられているnameプロパティの値があります。だから、なぜ追加のクエリが必要ですか?最新の価値などを確保するためには?

答えて

0

デフォルトでは、SQLAlchemyはコミット時にセッション内のオブジェクトを期限切れにします。これはexpire_on_commitパラメータで制御されます。

これは、インスタンスの背後にある行がトランザクション外で変更されている可能性があるため、慎重ではない場合はデータ競合に遭遇する可能性がありますが、何をしているのか分かっていれば、オフ。

+0

したがって、トランザクションが終了すると、内部で作成されたすべてのオブジェクトの有効期限が切れます。それは? – miso

+1

これはデフォルトの動作です(yes)。新しく挿入されたオブジェクトだけでなく、トランザクション中に照会したオブジェクトも含みます。 – univerio

関連する問題