2011-12-22 66 views
4

我正在使用sqlalchemy(现在用sqlite,但这可能稍后会改变)来建立一个数据库,其中插入顺序和rowids是重要的。我主要有以下几个:sqlalchemy在多对一/多对多的关系中保持秩序吗?

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,我想可以肯定的是,当我犯这个数据库的Ref旨意在插入它们出现在列表中的顺序相同。 sqlalchemy默认是这样做还是每次追加后都需要刷新?

回答

3

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


如果你真的需要rowids全球的要求有序的,有使其工作外的箱子没有简单方式。

但是,如果你需要的是Message订货Ref,那么可以通过添加另一个列Ref用于指示排序,其中使用Ordering List扩展是最简单的方法情况下,实现这一目标实现。这将同时加载和插入保持排序的对象。

+2

对。我的5¢:对于多对多,您需要一个带有订购字段的中间模型,与它的关系以及关联代理来隐藏这些实现细节。 – 2011-12-22 15:50:35

+0

谢谢范,看起来完美,我需要:) – Asterism 2011-12-23 05:43:31