SQLAlchemy декларативная ошибка «один ко многим» не определена - PullRequest
5 голосов
/ 20 ноября 2010

Я пытаюсь понять, как определить отношение один-ко-многим, используя декларативный ORM SQLAlchemy, и пытаюсь заставить пример работать, но я получаю ошибку, что мой подчиненный класс не может быть найден (естественно, потому что он объявлен позже ...)

InvalidRequestError: При инициализации mapper Mapper | Parent | parent в выражении «Child» не удалось найти имя («имя« Child »не определено»). Если это имя класса, рассмотрите возможность добавления этого отношения () в класс после определения обоих зависимых классов.

Но как мне это определить, без ошибки?

код:

from sqlalchemy import create_engine
from sqlalchemy import Column, Integer, ForeignKey
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import sessionmaker, relationship
from dev.historyMeta import VersionedMeta, VersionedListener

global engine, Base, Session
engine = create_engine('mysql+mysqldb://user:pass@localhost:3306/testdb', pool_recycle=3600)
Base = declarative_base(bind=engine, metaclass=VersionedMeta)
Session = sessionmaker(extension=VersionedListener())


class Parent(Base):
    __tablename__ = 'parent'
    id = Column(Integer, primary_key=True)
    children = relationship("Child", backref="parent")

class Child(Base):
    __tablename__ = 'child'
    id = Column(Integer, primary_key=True)
    parent_id = Column(Integer, ForeignKey('parent.id'))

Base.metadata.create_all()

1 Ответ

14 голосов
/ 21 ноября 2010

Вот как я это делаю:

from sqlalchemy import create_engine
from sqlalchemy import Column, Integer, ForeignKey
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import sessionmaker, relationship

engine = create_engine('sqlite://', echo=True)
Base = declarative_base(bind=engine)
Session = sessionmaker(bind=engine)


class Parent(Base):
    __tablename__ = 'parent'
    id = Column(Integer, primary_key=True)

class Child(Base):
    __tablename__ = 'child'
    id = Column(Integer, primary_key=True)
    parent_id = Column(Integer, ForeignKey('parent.id'))
    parent = relationship(Parent, backref='children')

Base.metadata.create_all()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...