我在学习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
我意外地运行了两次主文件,这使得以下代码运行了两次
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'
我通过打印a.addresses确认只存在Address对象,它只显示了对象。
它是否应该在附加的a.addresses中添加第二个Address对象而不是更新现有地址对象的id?
注意没有执行session.commit()命令。我只是运行了两次文件并注意到了这种行为。
编辑:添加了创建新会话的代码,并负责解决问题,如下面的回答
中的van所示答案 0 :(得分:0)
这在您的代码中无法看到,但我假设执行两次的代码也在两个不同的会话中执行。这将解释您观察到的所有副作用:
ID
增加:这是因为第一个会话中的flush()
,其中标识符已分配给对象。这不是对之前Address
的更新,而是对新ID
的{{1}}分配。