2011-10-18 4 views
0

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 
  1. 次のコードの実行を作った二回

    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回実行し、この動作に気付きました。

編集:新しいセッションを作成し、これはあなたのコードで見ることができない答え

答えて

0

に以下のバンによって示唆されているように問題を担当してコードを追加しましたが、私は2回実行されるコードでもあることを前提としてい2つの異なるセッション内で実行されます。

  • 1つのアドレスだけを::第二セッションは最初のものを認識していないので、( - EDをコミットしない)
  • アドレスIDが増加している:のためですこれは、あなたが観察すべて副作用を説明するだろうflush()が、識別子がオブジェクトに割り当てられている最初のセッションに格納されます。これは以前のAddressの更新ではなく、新しいAddressへのIDの割り当てです。
+0

はい、あなたは正しいです。だから何が起きているのは、最初のセッションが閉じられておらず、コミットされていないことですこの第2のセッションオブジェクトのために、第1のセッションオブジェクトによって使用されるIDを使用することはできない。 2番目のセッションを実行する前に最初のセッションを終了したら、これは起こらなかったでしょうか? – codecool

関連する問題