web-dev-qa-db-ja.com

ArgumentError:関係にはクラスまたはマッパー引数が必要です

この奇妙なエラーが発生しています。無関係なテーブルに変更を加えたため、奇妙と言っています。

次のような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を初めて使用しているので、別のテーブルを反復処理している場合、その関係を追加するとこのエラーが発生する方法がわかりません

25
john

それはとてもばかげた間違いなので自分自身に満足していませんが、ここに私の犯人があります:

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

でなければなりません:

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

tではなくTを大文字にすると、実際のテーブル名ではなく、クラスを参照する必要があります:'tReportType'-> 'TReportType'

53
john