Ich versuche herauszufinden, wie SQLAlchemy-Klassen auf mehrere Dateien verteilt werden können, und ich kann für mein Leben nicht herausfinden, wie das geht. Ich bin ziemlich neu in SQLAlchemy, also vergib mir, wenn diese Frage trivial ist.
Betrachten Sie diese 3 Klassen in jeder eigenen Datei :
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"))
Und dann sagen wir, wir haben eine main.py wie diese:
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()
Das obige gibt den Fehler:
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'
Wie teile ich die deklarative Basis für diese Dateien?
Was ist der "richtige" Weg, um dies zu erreichen, wenn man bedenkt, dass ich so etwas wie Pylone oder Turbogears darüber werfen könnte ?
bearbeiten 10-03-2011
Ich fand diese Beschreibung von den Pyramiden Rahmen , die das Problem und was noch wichtiger beschreiben prüft , dass dies ein tatsächliches Problem ist und nicht (nur) nur mein verwirrtes Selbst , das ist das Problem. Hoffe, es kann anderen helfen, die es wagen, diesen gefährlichen Weg zu gehen :)