有一個很好的機會,你不需要需要發出兩個提交;使用sqlalchemy會話的主要原因之一是它能夠理解對象如何相互關聯,並且會以插入數據的方式正確插入數據並正確表示所需的結構。這主要通過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
列本身。
>>> 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()
隨着echo=True
,輸出看起來有點像這樣:
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
注意,my_a
對象被插入,並且SQLAlchemy的讀取分配的主密鑰,並使用該用於插入用於my_b
。
不可能告訴,寫一些示例代碼,它有相同的問題 – knitti