SQLAlchemy 声明式一对多未定义错误

8 投票
1 回答
12094 浏览
提问于 2025-04-16 07:23

我正在尝试用SQLAlchemy的声明式ORM来定义一个一对多的关系,并且想让这个例子正常工作,但我遇到了一个错误,提示找不到我的子类(这很正常,因为它是在后面声明的...)

无效请求错误:在初始化映射器 Mapper|Parent|parent 时,表达式 'Child' 无法找到名称(“名称 'Child' 未定义”)。如果这是一个类名,请考虑在定义了两个相关类之后再将这个 relationship() 添加到类中。

但是我该如何定义这个关系,才能避免这个错误呢?

代码如下:

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 个回答

16

这是我做的方式:

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

撰写回答