2010-11-13 5 views
2

J'ai un objet plutôt complexe qui prend quelques autres objets comme ses membres. Quelque chose comme ceci:SQLalchemy avec la classe imbriquée

from engine import engine 

Class Car(object): 

    def __init__(self,engine_type): 
     self.engine=engine(engine_type) 

Y at-il une approche sans douleur pour cartographier ces définitions imbriquées à une base de données, en utilisant SQLAlchemy par exemple?

Merci pour votre aide. J'apprends SQLAlchemy et travaille avec ORMS.

+0

effort vaillant au formatage du code, mais j'ai dû le réparer pour vous. Utilisez quatre espaces devant un bloc de code comme je l'ai fait. utilisez le caractère 'pour le code en ligne. – aaronasterling

+0

J'adorerais avoir une réponse où les champs 'Engine' sont mappés au même tabe que les champs' Car', car ils sont liés 1: 1. Hibernate fait cela hors de la boîte. –

Répondre

1

Ce que vous essayez d'accomplir n'est pas très clair. Si je comprends bien, vous essayez de définir le modèle de voiture avec attribut moteur qui pointe vers un autre modèle de moteur, et en créant des objets de voiture avec engine_type, le code doit soit:

  • créer un objet moteur avec le type de moteur si elle n » t existe
  • charge l'objet du moteur avec le type de moteur si existe

puis l'affecter à l'objet de voiture.

Si tel est le cas, procédez comme suit.

class Engine(object): 
    def __init__(self, engine_type): 
     self.engine_type 

    @staticmethod 
    def load(engine_type): 
     return session.query(Engine)\ 
         .filter(engine_type==engine_type).one() 

class Car(object): 
    def __init__(self, engine_type): 
     try: 
      engine = Engine.load(engine_type) 
     except NoResultsFound: 
      engine = Engine(session_type) 
      session.add(engine) 
     self.engine=engine 

Vous devrez définir pour créer la relation « moteur » sur la voiture vous Mapper, et vous aurez besoin de peaufinage de code pour activer la portée de l'objet de la session en cas de besoin.

+0

Cela se compliquerait bientôt si les sous-composants du moteur devaient être chargés de la même manière. Donc, avec un ORM, je ne peux pas simplement avoir des relations imbriquées complexes? – Payaam

+0

Par exemple, disons que le moteur a un élément d'objet cylindre. Et vous voulez lister les voitures avec un nombre différent de cylindres. (disons que le moteur a une liste d'objets de cylindre, [cylindre1, cylindre2, ...] Est-ce que tout ce qui est dans un modèle comme celui-ci persiste aussi fort qu'il le semble ou devrais-je juste essayer de définir le modèle de voiture? – Payaam

+0

Je ne pense pas que ce soit un problème si vous ne voulez pas réaliser le modèle de moteur avec un modèle Cylinder, dans votre cas un moteur à plusieurs cylindres, si je comprends bien. Vous pouvez plus tard obtenir la liste de voitures avec le respect des cylindres avec facilité. Si vous pouvez me donner des aspects spécifiques de Engine-Cylinder rel et quelle liste de voitures vous voulez charger, je peux modifier le code pour vous aider. – vonPetrushev

Questions connexes