Jon*_*age 4 python join sqlalchemy
在SQLAlchemy中对同一个表数据加入两个查询的正确方法是什么?
即我有一个数据类定义如下:
class DataMeasurement(Base):
__tablename__ = 'DataMeasurement'
id = Column(Integer, Sequence('data_measurement_id_seq'), primary_key=True)
data_source = Column(String)
timestamp = Column(DateTime)
sensor_output = Column(Float)
Run Code Online (Sandbox Code Playgroud)
...我想加入以下两个有匹配时间戳的查询:
q1 = self.session.query(DataMeasurement).filter_by(data_source='Sensor1').order_by(DataMeasurement.timestamp)
q2 = self.session.query(DataMeasurement).filter_by(data_source='Sensor2').order_by(DataMeasurement.timestamp)
# ...and now what?
Run Code Online (Sandbox Code Playgroud)
有办法简单地做到这一点吗?...或者我是否以一种根本上有缺陷的方式解决这个问题(我对SQLAlchemy很新)?
使用子查询:
subq = self.session.query(DataMeasurement).\
filter_by(data_source='Sensor1').subquery()
q = self.session.query(
DataMeasurement.timestamp,
# Use labels to distinguish between identically named columns.
# This is optional.
subq.c.sensor_output.label('output1'),
DataMeasurement.sensor_output.label('output2')
).filter(
(DataMeasurement.data_source == 'Sensor2') &
(DataMeasurement.timestamp == subq.c.timestamp)
)
# Simply get a list of named tuples.
print q.all()
# Or access each column using properties.
for row in q:
print row.timestamp, row.output1, row.output2
Run Code Online (Sandbox Code Playgroud)
您还可以将结果作为DataMeasurement对象获取:
subq = self.session.query(DataMeasurement).\
filter_by(data_source='Sensor1').subquery()
# Use alias to associate mapped class to a subquery.
dmalias = aliased(DataMeasurement, subq)
q = self.session.query(dmalias, DataMeasurement).filter(
(DataMeasurement.data_source == 'Sensor2') &
(DataMeasurement.timestamp == dmalias.timestamp)
)
# For each row you get a tuple containing two DataMeasurement objects.
for dm1, dm2 in q:
print dm1.timestamp, dm1.sensor_output, dm2.sensor_output
Run Code Online (Sandbox Code Playgroud)