SQLAlchemy:如何保持记录ID及其关系记录同步新记录(预提交)?

时间:2016-03-02 22:29:15

标签: python sqlalchemy

在创建新记录时,我希望外键字段和它们的关系对象保持同步(如果我改变一个,另一个会改变以反映),但这似乎不是案子。这可能吗?

鉴于以下内容:

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或对象。

1 个答案:

答案 0 :(得分:0)

你可以通过刷新来完成这个:

manufacturerId

Flushing会发出conn.add(guitar) conn.add(name) conn.flush() 个查询,但不会INSERT,这意味着如果需要,您可以COMMIT