Estoy tratando de averiguar cómo hacer que las clases de SQLAlchemy se distribuyan en varios archivos y, por mi vida, no puedo averiguar cómo hacerlo. Soy bastante nuevo en SQLAlchemy, así que perdóname si esta pregunta es trivial.
Considere estas 3 clases en cada uno su propio archivo :
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"))
Y luego digamos que tenemos un main.py algo como esto:
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()
Lo anterior da el error:
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'
¿Cómo comparto la base declarativa entre estos archivos?
¿Cuál es la forma "correcta" de lograr esto, considerando que podría arrojar algo como Pylons o Turbogears encima de esto?
editar 10-03-2011
Encontré esta descripción del marco de Pyramids que describe el problema y, lo que es más importante, verifica que este es un problema real y no (solo) mi yo confundido, ese es el problema. Espero que pueda ayudar a otros que se atreven por este camino peligroso :)