from sqlalchemy import cast, Date, TIMESTAMP, DateTime, String, BIGINT, func, and_
简单查询+子连接+函数:
dag_infos1 = session.query(DcmpLineage.dag_name.label('dag_name'), DcmpLineage.task_name.label('task_name'),
DcmpLineage.task_type,
DcmpLineage.task_dc.label('task_dc'),
DcmpLineage.owner.label('owner'),
TaskInstance.state,
func.cast(TaskInstance.start_date, String).label('start_date'),
func.cast(TaskInstance.execution_date, BIGINT).label('execution_date'),
func.ceil(TaskInstance.duration / 60).label('duration'), DcmpLineage.upstreams,
DcmpLineage.data_in, DcmpLineage.data_out) \
.filter(DcmpLineage.dag_name == target_dag_name, DcmpLineage.dag_name == TaskInstance.dag_id,
TaskInstance.task_id == func.concat_ws("_", DcmpLineage.task_name, DcmpLineage.task_dc)
, DcmpLineage.owner == "{}".format(owner)) \
.subquery('t1')
左外连接:
dag_infos = session.query(dag_infos2, dag_infos1).outerjoin(
dag_infos1,
and_(
dag_infos1.c.dag_name == dag_infos2.c.dag_name,
dag_infos1.c.task_dc == dag_infos2.c.task_dc,
dag_infos1.c.task_name == dag_infos2.c.task_name,
dag_infos1.c.execution_date == dag_infos2.c.execution_date
)
)