在Sqlalchemy Strange行为中,在类关系属性中追加对象两次

时间:2011-10-18 10:29:24

标签: python sqlalchemy foreign-keys

我在学习SQLAlchemy时面临一些奇怪的问题。我正在使用它的0.7.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会有两个带有'myaddress'的地址对象。但实际上只有一个对象的address_id得到了更新。我的意思是说当我首先运行文件时它打印

    1,'myaddress'
    
    and then in second run it printed
    
    2,'myaddress'
    
  2. 我通过打印a.addresses确认只存在Address对象,它只显示了对象。

    它是否应该在附加的a.addresses中添加第二个Address对象而不是更新现有地址对象的id?

    注意没有执行session.commit()命令。我只是运行了两次文件并注意到了这种行为。

    编辑:添加了创建新会话的代码,并负责解决问题,如下面的回答

    中的van所示

1 个答案:

答案 0 :(得分:0)

这在您的代码中无法看到,但我假设执行两次的代码也在两个不同的会话中执行。这将解释您观察到的所有副作用

  • 只有一个地址:因为第二个会话不知道第一个会话(未提交)
  • 地址ID增加:这是因为第一个会话中的flush(),其中标识符已分配给对象。这不是对之前Address的更新,而是对新ID的{​​{1}}分配。