【发布时间】:2016-03-03 08:33:33
【问题描述】:
创建新记录时,我希望外键字段和它们的关系对象保持同步(如果我更改一个,另一个会更改以反映),但情况似乎并非如此。这可以吗?
鉴于以下情况:
Base = declarative_base();
class User(Base):
__tablename__ = 'user';
id = Column(Integer, primary_key=True);
name = Column(String);
fullname = Column(String);
password = Column(String);
equipment = relationship('Equipment', backref='user');
class Equipment(Base):
__tablename__ = 'equipment';
id = Column(Integer, primary_key=True);
user_id = Column(Integer, ForeignKey('user.id'), nullable=False);
name = Column(String);
engine = create_engine('sqlite:///:memory:', echo=True);
Base.metadata.create_all(engine);
session = sessionmaker(bind=engine);
conn = session();
conn.add_all([
User(name='bill', fullname='Bill W.', password='rlrrlrll'), # id=1
User(name='tony', fullname='Tony I.', password='EADGBe'), # id=2
User(name='ozzy', fullname='Ozzy O.', password='durrrr'), # id=3
User(name='geezer', fullname='Terence B.', password='password'), # id=4
]);
我可以通过以下两种方式之一创建相关记录:
guitar = Equipment(
user = conn.query(User).filter(User.name == 'tony').one(),
name = 'Gibson SG');
drums = Equipment(
user_id = 1,
name = 'Ludwigs');
按照这些行,我希望 guitar.user_id 为 2,drums.user 为 'bill' 对象,但在这两种情况下它们都不是。在我 conn.add()/conn.commit() 之后,它开始像我预期的那样工作(两个互补字段都返回非 None 值)。
有什么办法可以在预提交之前工作吗?我希望能够以任何一种方式(通过 ID 或通过对象)构造新记录,并且在库函数中能够可靠地访问 ID 或对象。
【问题讨论】:
标签: python sqlalchemy