J'essaie de comprendre comment répartir les classes SQLAlchemy dans plusieurs fichiers, et je n'arrive pas à trouver comment le faire. Je suis assez novice en SQLAlchemy donc pardonnez-moi si cette question est triviale
Considérons ces 3 classes en chacun son dossier :
A.py :
from sqlalchemy import *
from main import Base
class A(Base):
__tablename__ = "A"
id = Column(Integer, primary_key=True)
Bs = relationship("B", backref="A.id")
Cs = relationship("C", backref="A.id")
B.py :
from sqlalchemy import *
from main import Base
class B(Base):
__tablename__ = "B"
id = Column(Integer, primary_key=True)
A_id = Column(Integer, ForeignKey("A.id"))
C.py :
from sqlalchemy import *
from main import Base
class C(Base):
__tablename__ = "C"
id = Column(Integer, primary_key=True)
A_id = Column(Integer, ForeignKey("A.id"))
Et puis disons que nous avons un main.py quelque chose comme ça :
from sqlalchemy import create_engine
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import relationship, backref, sessionmaker
Base = declarative_base()
import A
import B
import C
engine = create_engine("sqlite:///test.db")
Base.metadata.create_all(engine, checkfirst=True)
Session = sessionmaker(bind=engine)
session = Session()
a = A.A()
b1 = B.B()
b2 = B.B()
c1 = C.C()
c2 = C.C()
a.Bs.append(b1)
a.Bs.append(b2)
a.Cs.append(c1)
a.Cs.append(c2)
session.add(a)
session.commit()
Ce qui précède donne l'erreur :
sqlalchemy.exc.NoReferencedTableError: Foreign key assocated with column 'C.A_id' could not find table 'A' with which to generate a foreign key to target column 'id'
Comment partager la base déclarative entre ces fichiers ?
Quelle est la "bonne" façon d'y parvenir, sachant que je pourrais lancer quelque chose comme Pylônes o Turbogears en plus de cela ?
modifier 10-03-2011
J'ai trouvé este description du cadre des Pyramides qui décrit le problème et, plus important encore, qui décrit le problème et, plus important encore, qui décrit le problème. vérifie qu'il s'agit d'un problème réel et que ce n'est pas (seulement) mon moi confus qui est en cause. J'espère que cela pourra aider d'autres personnes qui osent s'engager sur cette voie dangereuse :)