Sqlalchemy 跨带@.表达式的自联接的混合属性

Sqlalchemy 跨带@.表达式的自联接的混合属性,sqlalchemy,expression,self-join,hybrid,Sqlalchemy,Expression,Self Join,Hybrid,在以下示例中,父表设备有一个子表度量,其中包含连续几天的度量。我已经通过关系measurement\u next创建了一个自联接,该关系用于设置混合属性meas\u val\u diff,该属性由一天的测量值与第二天的差值组成: class Device(Base): __tablename__ = 'device' dev_id = Column(BigInteger, Sequence('id_device_seq'), primary_key=True) mea

在以下示例中,父表设备有一个子表度量,其中包含连续几天的度量。我已经通过关系measurement\u next创建了一个自联接,该关系用于设置混合属性meas\u val\u diff,该属性由一天的测量值与第二天的差值组成:

class Device(Base):
    __tablename__ = 'device'

    dev_id = Column(BigInteger, Sequence('id_device_seq'), primary_key=True)

    measurements = relationship("Measurement", primaryjoin="Measurement.id_device==Device.dev_id", backref='device')


class Measurement(Base):
    __tablename__= 'measurement'
    __table_args__ = (
        UniqueConstraint('id_device', 'meas_date', name='uix_measurement_mp_meas_date'),
        Index('ix_measurement_meas_date', 'meas_date'),
        ForeignKeyConstraint(['id_device', 'meas_date'], ['measurement.id_device', 'measurement.meas_date'],
                             name='fk_measurement_mpid_ephdate', use_alter=True),
        {}
    )

    id_meas = Column(BigInteger, Sequence('measurment_seq'), primary_key=True)
    id_device = Column(BigInteger, ForeignKey('device.dev_id', name='fk_measurement_id_device'), nullable=False,)
    meas_date = Column(DateTime, nullable=False)
    meas_val = Column(Float)
    '''
    Note!! Implementation depends on the target database engine having User-Defined Function
    next_day()
    '''
    measurement_next = relationship("Measurement",
                                    primaryjoin=and_(remote(foreign(id_device)) == id_device,
                                                     remote(foreign(meas_date)) == func.next_day(meas_date)
                                                     ),
                                    remote_side=[id_device, meas_date],
                                    lazy='joined',
                                    viewonly=False,
                                    uselist=False,  # (edit)
                                    join_depth=1
                                    )

    @hybrid_property
    def meas_val_diff(self):
        return self.measurement_next.meas_val - self.meas_val
混合属性表示在简单查询中正确工作。 现在我希望能够通过meas_val_diff进行过滤,但我不知道如何构造一个混合表达式来实现这一点。 本质上,我正在尝试获取一个类似以下内容的SQL查询:

SELECT measurement.id_meas AS measurement_id_meas,
measurement.id_device AS measurement_id_device,
measurement.meas_date AS measurement_meas_date,
measurement.meas_val AS measurement_meas_val,
measurement_1.id_meas AS measurement_1_id_meas, 
measurement_1.id_device AS measurement_1_id_device,
measurement_1.meas_date AS measurement_1_meas_date, measurement_1.meas_val AS measurement_1_meas_val 
FROM measurement
LEFT OUTER JOIN measurement AS measurement_1 ON measurement_1.id_device = measurement.id_device
 AND measurement_1.meas_date = next_day(measurement.meas_date) 
WHERE (measurement_1.meas_val - measurement.meas_val) > :meas_val_1
@meas_val_diff.expression
def meas_val_diff(self):
    return self.measurement_next.meas_val - self.meas_val
我的原始尝试是构建一个@meas_val_diff.expression方法,该方法将实现以下目标:

SELECT measurement.id_meas AS measurement_id_meas,
measurement.id_device AS measurement_id_device,
measurement.meas_date AS measurement_meas_date,
measurement.meas_val AS measurement_meas_val,
measurement_1.id_meas AS measurement_1_id_meas, 
measurement_1.id_device AS measurement_1_id_device,
measurement_1.meas_date AS measurement_1_meas_date, measurement_1.meas_val AS measurement_1_meas_val 
FROM measurement
LEFT OUTER JOIN measurement AS measurement_1 ON measurement_1.id_device = measurement.id_device
 AND measurement_1.meas_date = next_day(measurement.meas_date) 
WHERE (measurement_1.meas_val - measurement.meas_val) > :meas_val_1
@meas_val_diff.expression
def meas_val_diff(self):
    return self.measurement_next.meas_val - self.meas_val
导致


AttributeError(“与测量相关联的'InstrumentedAttribute'对象和'Comparator'对象都没有。测量\u接下来有一个属性'meas\u val'”)

想法