SQLAlchemyを学ぶ際に奇妙な問題に直面しています。私はそれの0.7.2バージョンを使用しています。これらは、私のテストクラスです:私は誤って二回私のメインのファイルを実行したSqlalchemyクラス関係属性でオブジェクトを2回追加する際の奇妙な動作
class User(Base):
__tablename__ = 'users'
id = Column('user_id',Integer,primary_key = True)
name = Column('user_name',String(20))
addresses = relationship("Address",backref="user")
def __repr__(self):
return "<User(%s)>" % self.name
class Address(Base):
__tablename__ = 'addresses'
id = Column('adress_id',Integer,primary_key = True)
address = Column('address',String(30))
user_id = Column('user_id',ForeignKey('users.user_id'))
def __repr__(self):
return "<Address(%s)>" % self.address
次のコードの実行を作った二回
Session = sessionmaker() session = Session(bind=engine) q=session.query(User) a=q.get(3) a.addresses.append(Address(address='myaddress')) session.flush() print a.addresses[0].id,a.addresses[0].address
私が最初にa.addressesは、2つのアドレスオブジェクトとを持っているだろうと思いました'私のアドレス'。しかし、実際にはaddress_idが更新されたオブジェクトは1つだけです。私はそれが私が印刷a.addressesだけAddressオブジェクトの存在を確認し、それはそれでだけオブジェクトを示し
1,'myaddress' and then in second run it printed 2,'myaddress'
既存のアドレスオブジェクトのIDを更新するのではなく、appendのa.addressesに2番目のAddressオブジェクトを追加する必要がありますか?
注意session.commit()コマンドは実行されません。私は単純にファイルを2回実行し、この動作に気付きました。
編集:新しいセッションを作成し、これはあなたのコードで見ることができない答え
はい、あなたは正しいです。だから何が起きているのは、最初のセッションが閉じられておらず、コミットされていないことですこの第2のセッションオブジェクトのために、第1のセッションオブジェクトによって使用されるIDを使用することはできない。 2番目のセッションを実行する前に最初のセッションを終了したら、これは起こらなかったでしょうか? – codecool