2011-12-22 4 views
4

J'utilise sqlalchemy (avec sqlite pour l'instant, mais cela pourrait changer plus tard) pour construire une base de données dans laquelle l'ordre des insertions et donc rowids est important. J'ai essentiellement les éléments suivants:sqlalchemy conserve-t-il l'ordre dans les relations plusieurs-à-un/plusieurs-à-plusieurs?

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')) 

Lorsque je crée un objet Message et append un objet Ref à message.refs, je voudrais être sûr que quand je commets ce à la base de données les Ref s seront insérés dans le même ordre dans lequel ils apparaissent dans la liste. Est-ce que sqlalchemy le fait par défaut ou dois-je le vider après chaque ajout?

Répondre

3

Non: même si dans votre cas simple cela fonctionnerait probablement de cette façon, sqlalchemy ne donne aucune garantie quant à l'ordre d'insertion.


Si vous avez vraiment besoin d'être rowidsglobalement ordonnée à la demande, il n'y a pas moyen simple de faire fonctionner hors de la boîte.

Cependant, si ce que vous avez besoin est commande de Ref dans le Message, cela peut être réalisé en ajoutant une autre colonne à Ref pour indiquer l'ordre, dans ce cas, en utilisant l'extension Ordering List est la meilleure façon d'y parvenir . Ceci fera à la fois le chargement et l'insertion des objets Ref en gardant la commande.

+2

Droite. Mes 5 ¢: pour beaucoup-à-plusieurs, vous aurez besoin d'un modèle intermédiaire avec un champ d'ordre, une relation avec celui-ci et un proxy d'association pour cacher ces détails d'implémentation. –

+0

Merci van, ça a l'air parfait pour ce dont j'ai besoin :) – Asterism

Questions connexes