2011-12-22 12 views
4

私はsqlalchemyを使用しています(今はsqliteを使用していますが、これは後で変更される可能性があります)。挿入とROWIDの順序が重要なデータベースを構築します。私は基本的には次があります。sqlalchemyは、多対1 /多対多の関係で順序を保持していますか?

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.refsMessageオブジェクトとappendRefオブジェクトを作成するときに、私はデータベースにこれをコミットするとRef秒が挿入されることを確認してくださいしたいと思いますそれらがリストに表示される順序と同じです。 sqlalchemyはこれをデフォルトで行うのですか、それともそれぞれの後にフラッシュする必要がありますか?

答えて

3

いいえ:簡単な場合でもおそらくこのように動作しますが、sqlalchemyは挿入の順序については何も保証しません。


あなたは本当にrowidsが要求されるように命じたグローバルする必要がある場合、それはアウトオブボックスに動作することのない簡単な方法はありません。しかし

、何が必要なの、これはOrdering List拡張機能を使用すると、これを達成するための最も簡単な方法であり、その場合には、順序を示すためRefに別の列を追加することによって達成することができ、MessageRef順序である場合。これは、注文を維持しながらRefオブジェクトのロードと挿入の両方を行います。

+2

右。 My 5¢:多対多の場合、これらの実装の詳細を隠すために、注文フィールド、関係、関連プロキシを持つ中間モデルが必要です。 –

+0

おかげで、私は何が必要なのか完璧に見えます:) – Asterism