Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/287.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 在union的SQLAlchemy查询中按标记列筛选_Python_Sqlalchemy - Fatal编程技术网

Python 在union的SQLAlchemy查询中按标记列筛选

Python 在union的SQLAlchemy查询中按标记列筛选,python,sqlalchemy,Python,Sqlalchemy,意识到标题几乎等同于我相信这是一个单独的问题 为了大大简化我的问题:假设我有两个查询,每个查询返回我想要的结果的子集,我将它们合并在一起: initial_task = "initial_task" scheduled_task = "scheduled_task" initial = session.query(Task.task_id, User.signup_date.label('due_date'),

意识到标题几乎等同于我相信这是一个单独的问题

为了大大简化我的问题:假设我有两个查询,每个查询返回我想要的结果的子集,我将它们合并在一起:

initial_task = "initial_task"
scheduled_task = "scheduled_task"

initial = session.query(Task.task_id,
                        User.signup_date.label('due_date'),
                        literal(initial_task).label('type'))\
                 .join(Task.user)

schedule = session.query(Task.task_id,
                        Schedule.due_date.label('due_date'),
                        literal(scheduled_task).label('type'))\
                  .join(Task.schedule)

tasks = initial.union_all(schedule)
明确地说:我意识到这个例子可以在没有工会的情况下改写;我的实际用例有五个独立的查询,除了结果可以强制为这种正常格式之外,几乎没有任何共同之处

如何筛选任务以仅包括2017年4月1日之后到期的任务?从概念上讲,类似于:

tasks.filter(tasks.c.due_date >= datetime(2017, 4, 1))
主要的问题是我不知道如何以一般方式引用到期日列。我在文档中尝试的所有内容似乎都在谈论较低级别的API,而在ORM层上,则会导致:

'Query' object has no attribute 'c'
该方法生成一个新的查询实例,这与构造生成的CompoundSelect略有不同,如您所述。您可以使用来筛选查询:

In [18]: tasks.filter(literal_column('due_date') >= datetime(2017, 4, 1))
Out[18]: <sqlalchemy.orm.query.Query at 0x7f1d2e191b38>

In [19]: print(_)
SELECT anon_1.task_id AS anon_1_task_id, anon_1.due_date AS anon_1_due_date, anon_1.type AS anon_1_type 
FROM (SELECT task.id AS task_id, user.signup_date AS due_date, ? AS type 
FROM task JOIN user ON task.id = user.task_id UNION ALL SELECT task.id AS task_id, schedule.due_date AS due_date, ? AS type 
FROM task JOIN schedule ON task.id = schedule.task_id) AS anon_1 
WHERE due_date >= ?
另一方面,您可以只在各自的日期列上分别筛选联合体的各个部分

最后,如果子查询更接近简化示例中隐藏的实际目标,则可以将您的联合包装在子查询中:

In [26]: tasks_sq = tasks.subquery()

In [27]: session.query(tasks_sq).\
    ...:     filter(tasks_sq.c.due_date >= datetime(2017, 4, 1))
Out[27]: <sqlalchemy.orm.query.Query at 0x7f1d2e1d4828>

In [28]: print(_)
SELECT anon_1.task_id AS anon_1_task_id, anon_1.due_date AS anon_1_due_date, anon_1.type AS anon_1_type 
FROM (SELECT anon_2.task_id AS task_id, anon_2.due_date AS due_date, anon_2.type AS type 
FROM (SELECT task.id AS task_id, user.signup_date AS due_date, ? AS type 
FROM task JOIN user ON task.id = user.task_id UNION ALL SELECT task.id AS task_id, schedule.due_date AS due_date, ? AS type 
FROM task JOIN schedule ON task.id = schedule.task_id) AS anon_2) AS anon_1 
WHERE anon_1.due_date >= ?