【问题标题】:SQLAlchemy: How to keep the record ID and its relationship record in sync for new records (pre-commit)?SQLAlchemy:如何使新记录的记录 ID 及其关系记录保持同步(预提交)?
【发布时间】: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


    【解决方案1】:

    你可以通过冲洗来做到这一点:

    conn.add(guitar)
    conn.add(name)
    conn.flush()
    

    Flushing 会发出 INSERT 查询,但不会发出 COMMIT,这意味着如果需要,您可以稍后 ROLLBACK

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-03-12
      • 1970-01-01
      • 1970-01-01
      • 2013-06-05
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多