Sqlalchemy 跨带@.表达式的自联接的混合属性
在以下示例中,父表设备有一个子表度量,其中包含连续几天的度量。我已经通过关系measurement\u next创建了一个自联接,该关系用于设置混合属性meas\u val\u diff,该属性由一天的测量值与第二天的差值组成: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
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'”) 想法