sqlalchemy是否保持多对多/多对多关系中的顺序?

Ast*_*ism 6 sqlalchemy

我正在使用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'))
Run Code Online (Sandbox Code Playgroud)

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

van*_*van 5

:即使在你的简单案例中它可能会以这种方式工作,sqlalchemy也不会对插入顺序做出任何保证.


如果你真的需要按照要求rowids进行全球订购,那么就没有简单的方法可以让它开箱即用.

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

  • 对.我的5¢:对于多对多,您需要一个带有排序字段的中间模型,与它的关系以及关联代理来隐藏这些实现细节. (2认同)