【问题标题】:Does sqlalchemy preserve order in many-to-one/many-to-many relationships?sqlalchemy 是否保留多对一/多对多关系中的顺序?
【发布时间】:2011-12-22 16:36:24
【问题描述】:

我正在使用 sqlalchemy(现在使用 sqlite,但以后可能会改变)来构建一个数据库,其中插入顺序和 rowid 很重要。我基本上有以下几点:

class Message(Base):
    __tablename__ = 'messages'
    __table_args__ = {'sqlite_autoincrement':True}
    id = Column(Integer, primary_key=True)
    refs = relationship('Ref')

class Ref(Base):
    __tablename__ = 'refs'
    __table_args__ = {'sqlite_autoincrement':True}
    id = Column(Integer, primary_key=True)
    message_id = Column(Integer, ForeignKey('messages.id'))

当我创建一个Message 对象和append 一个Ref 对象到message.refs 时,我想确保当我将它提交到数据库时,Refs 将被插入到它们在列表中出现的顺序相同。 sqlalchemy 是默认执行此操作还是需要在每次追加后刷新?

【问题讨论】:

    标签: sqlalchemy


    【解决方案1】:

    :即使在您的简单情况下它可能会以这种方式工作,sqlalchemy 也不对插入顺序做出任何保证。


    如果您确实需要按要求对rowids 进行全局 排序,则没有简单 方法可以使其开箱即用。

    但是,如果您需要Message 中对Ref 进行排序,则可以通过在Ref 中添加另一列来指示排序,在这种情况下使用Ordering List 扩展是实现这一目标的最简单方法。这将同时加载和插入Ref 对象以保持排序。

    【讨论】:

    • 对。我的 5 美分:对于多对多,您需要一个具有排序字段、与其关系以及关联代理的中间模型来隐藏这些实现细节。
    • 谢谢范,这看起来很适合我的需要:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-06-14
    • 2023-03-04
    • 1970-01-01
    • 2019-12-06
    • 2011-08-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多