2012-06-15 5 views
7

J'ai un problème avec la séparation des tables avec des relations dans différents fichiers. Je veux que les tables ci-dessous soient dans trois fichiers distincts et pour importer TableA dans une page tierce, mais je ne peux pas gérer l'ordre de chargement.SQLAlchemy importer des tables avec des relations

Je reçois la plupart du temps l'erreur suivante.

sqlalchemy.exc.InvalidRequestError: lors de l'initialisation de mapper Mapper | TableA | tablea, l'expression 'TableB' n'a pas réussi à localiser un nom ("nom 'TableB' n'est pas défini"). S'il s'agit d'un nom de classe , pensez à ajouter cette relation() à la classe une fois que les deux classes dépendantes ont été définies.

class TableA(Base): 
    __tablename__ = "tablea" 
    id = Column(Integer, primary_key=True) 
    name = Column(String) 

    tableB = relationship("TableB", secondary = TableC.__table__) 

class TableB(Base): 
    __tablename__ = "tableb" 
    id = Column(Integer, primary_key=True) 
    name = Column(String) 

class TableC(Base): 
    __tablename__ = "tableab" 
    tableAId = Column("table_a_id", Integer, ForeignKey("TableA.id"), primary_key=True) 
    tableBId = Column("table_b_id", Integer, ForeignKey("TableB.id"), primary_key=True) 

Répondre

3

Cela devrait fonctionner (notez que le TableC tableau est remplacé par le nom de la table pour éviter le chargement du module circulaire.):

### base.py 
engine = create_engine('sqlite:///:memory:', echo=True) 
Session = sessionmaker(bind=engine) 
Base = declarative_base(bind=engine) 

### classA.py 
from base import Base 
from classB import TableB 

class TableA(Base): 
    __tablename__ = 'tablea' 
    id = Column(Integer, primary_key=True) 
    name = Column(String(50)) 
    tableBs = relationship("TableB", secondary="tableab") 
    #tableBs = relationship("TableB", secondary=TableC.__table__) 

### classB.py 
from base import Base 

class TableB(Base): 
    __tablename__ = 'tableb' 
    id = Column(Integer, primary_key=True) 
    name = Column(String(50)) 

### classC.py 
from base import Base 
from classA import TableA 
from classB import TableB 

class TableC(Base): 
    __tablename__ = 'tableab' 
    tableAId = Column(Integer, ForeignKey("tablea.id"), primary_key=True,) 
    tableBId = Column(Integer, ForeignKey("tableb.id"), primary_key=True,) 

### main.py 
from base import Base, Session, engine 
from classA import TableA 
from classB import TableB 
from classC import TableC 
Base.metadata.create_all(engine) 

Je crois aussi que le paramètre ForeignKey est sensible à la casse, de sorte que le code ne fonctionne peut-être pas parce que "TableA.id" correspond au nom "tablea" lorsqu'il est sensible à la casse.

+1

Merci pour les answear :) – bozhidarc

+8

Devez-vous importer la classe pour pouvoir l'utiliser dans une relation? –

Questions connexes