はありませんは2つのコミットを発行する必要があります。 sqlalchemyセッションを使用する主な理由の1つは、オブジェクトがどのように相互に関連するかを理解し、データが正しく挿入され、目的の構造を正しく表すように挿入を順序付けます。これは、主にrelationship
構造を使用して動作します。ここでは簡単な例を示します。
>>> from sqlalchemy import *
>>> from sqlalchemy.orm import *
>>> from sqlalchemy.ext.declarative import declarative_base
>>> Base = declarative_base()
>>> class A(Base):
... __tablename__ = "a_table"
... id = Column(Integer, primary_key=True)
...
>>> class B(Base):
... __tablename__ = "b_table"
... id = Column(Integer, primary_key=True)
... a_id = Column(Integer, ForeignKey(A.id))
... a = relationship(A)
...
>>> my_a = A()
>>> my_b = B()
>>> my_b.a = my_a
>>>
最も重要な部分は、我々はB.a
を通じてA
とB
との関係を宣言しているということです。これを最大限に活用するには、この関係プロパティを使用してそれぞれのインスタンス間の関係を表現し、sqlalchemyがa_id
列自体を設定するようにしておくことが重要です。 echo=True
で
>>> engine = create_engine("sqlite:///:memory:")
>>> Base.metadata.create_all(engine)
>>> engine.echo = True
>>> Session = sessionmaker(engine)
>>>
>>> session = Session()
>>> session.add(my_a)
>>> session.add(my_b)
>>>
>>> session.commit()
、出力はビット次のようになります。my_a
オブジェクトが挿入されていることを
2011-09-16 17:19:22,367 INFO sqlalchemy.engine.base.Engine.0x...ed50 BEGIN (implicit)
2011-09-16 17:19:22,368 INFO sqlalchemy.engine.base.Engine.0x...ed50 INSERT INTO a_table DEFAULT VALUES
2011-09-16 17:19:22,368 INFO sqlalchemy.engine.base.Engine.0x...ed50()
2011-09-16 17:19:22,369 INFO sqlalchemy.engine.base.Engine.0x...ed50 INSERT INTO b_table (a_id) VALUES (?)
2011-09-16 17:19:22,369 INFO sqlalchemy.engine.base.Engine.0x...ed50 (1,)
2011-09-16 17:19:22,369 INFO sqlalchemy.engine.base.Engine.0x...ed50 COMMIT
お知らせ、およびSQLAlchemyのは、割り当てられた主キーを読み取り、my_b
のための挿入のためにそれを使用しています。
同じ問題があるいくつかのサンプルコードを記述することは不可能です – knitti