Классы SQLAlchemy в файлах

Я пытаюсь выяснить, как распределить классы SQLAlchemy по нескольким файлам, и я не могу понять, как это сделать. Я новичок в SQLAlchemy, так что простите меня, если этот вопрос тривиален.

Рассмотрим эти 3 класса в , каждый их собственный файл :

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"))

А затем предположим, что у нас есть main.py что-то вроде этого:

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()

Вышеупомянутое дает ошибку:

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'

Как мне совместно использовать декларативную базу в этих файлах ?

Каков "правильный" способ сделать это, учитывая, что я мог бы добавить что-то вроде Pylons или Turbogears поверх этого?

править 10-03 -2011

Я нашел это описание из структуры пирамид, которое описывает проблему и, что более важно, подтверждает , что это реальная проблема, а не (только) только мое смущенное я, которое проблема. Надеюсь, это поможет другим, кто решится на этот опасный путь :)

68
задан Paolo 24 September 2017 в 05:21
поделиться