ArgumentError:关系期望一个类或映射器参数

45 投票
1 回答
32125 浏览
提问于 2025-04-18 15:05

我遇到了一个奇怪的错误,我之所以说奇怪,是因为我只是对一个不相关的表做了修改。

我正在尝试查询我的 tDevice 表,结构如下:

class TDevice(Base):
    __tablename__ = 'tDevice'

    ixDevice = Column(Integer, primary_key=True)
    ixDeviceType = Column(Integer, ForeignKey('tDeviceType.ixDeviceType'), nullable=False)
    ixSubStation = Column(Integer, ForeignKey('tSubStation.ixSubStation'), nullable=False)
    ixModel = Column(Integer, ForeignKey('tModel.ixModel'), nullable=True)
    ixParentDevice = Column(Integer, ForeignKey('tDevice.ixDevice'), nullable=True)
    sDeviceName = Column(Unicode(255), nullable=False)#added

    children = relationship('TDevice',
                        backref=backref('parent', remote_side=[ixDevice]))

    device_type = relationship('TDeviceType',
                           backref=backref('devices'))

    model = relationship('TModel',
                     backref=backref('devices'))

    sub_station = relationship('TSubStation',
                           backref=backref('devices'))

这是我查询它的方式:

Device = DBSession.query(TDevice).filter(TDevice.ixDevice == device_id).one()

一执行到这一行,我就收到错误提示:

ArgumentError: relationship 'report_type' expects a class or a mapper argument (received: <class 'sqlalchemy.sql.schema.Table'>)

我唯一做的修改是给我的 tReportTable 添加了一个 report_type 的关系,现在它看起来是这样的:

class TReport(Base):
__tablename__ = 'tReport'

ixReport = Column(Integer, primary_key=True)
ixDevice = Column(Integer, ForeignKey('tDevice.ixDevice'), nullable=False)
ixJob = Column(Integer, ForeignKey('tJob.ixJob'), nullable=False)
ixReportType = Column(Integer, ForeignKey('tReportType.ixReportType'), nullable=False) # added

report_type = relationship('tReportType',
                           uselist=False,
                           backref=backref('report'))

device = relationship('TDevice',
                      uselist=False,
                      backref=backref('report'))

job = relationship('TJob',
                   uselist=False,
                   backref=backref('report'))

我还是 SqlAlchemy 的新手,所以我不明白为什么添加这个关系会导致这个错误,尤其是我其实是在遍历另一个表。

1 个回答

121

我对自己不太满意,因为这是个很愚蠢的错误,但这就是问题所在:

report_type = relationship('tReportType',
                           uselist=False,
                           backref=backref('report'))

应该是:

report_type = relationship('TReportType',
                           uselist=False,
                           backref=backref('report'))

应该用大写的T,而不是小写的t。我应该引用的是类名,而不是我实际的表名:'tReportType' -> 'TReportType'

撰写回答