我在将此SQL查询转换为SQL Alchemy查询时遇到问题:
query = """
SELECT i.case_num,
to_char(i.date_time, 'FMMonth FMDD, YYYY'),
to_char(i.date_time, 'HH24:MI'),
i.incident_type,
i.incident_cat,
i.injury,
i.property_damage,
i.description,
i.root_cause,
a.corrective_action,
a.due_date,
i.user_id
FROM incident as i, action_items as a
WHERE i.case_num = a.case_id AND i.case_num = %s;
"""我已经尝试了以下操作,但除了错误之外什么都没有收到:
sqlalchemy.orm.exc.NoResultFound:找不到一个()的行
results = dbsession.query(Incidents.case_num,
func.to_char(Incidents.date_time, 'FMMonth FMDD, YYYY'),
func.to_char(Incidents.date_time, 'HH24:MI'),
Incidents.incident_type,
Incidents.incident_cat,
Incidents.injury,
Incidents.property_damage,
Incidents.description,
Incidents.root_cause,
Actions.corrective_action,
Actions.due_date,
Incidents.user_id).join(Actions).filter_by(case_id = id).one()AttributeError:映射器
results = dbsession.query(Incidents.case_num,
func.to_char(Incidents.date_time, 'FMMonth FMDD, YYYY'),
func.to_char(Incidents.date_time, 'HH24:MI'),
Incidents.incident_type,
Incidents.incident_cat,
Incidents.injury,
Incidents.property_damage,
Incidents.description,
Incidents.root_cause,
Incidents.user_id).join(Actions.corrective_action, Actions.due_date).filter_by(case_id = id).one()我想我可以做两个独立的查询,但我更愿意弄清楚如何执行一个连接查询。
发布于 2017-09-07 23:20:26
您不需要显式地指定联接来让sqlalchemy生成您想要的语句。
另外,(我的意见)。避免使用filter_by。
在这种情况下,filter_by不够聪明,无法意识到id是Incidents中的一个列,因为id是一个内置函数。filter_by (see source)接受where条件作为关键字参数,将它们解包,将键视为要查找的列,而不是值,然后调用连接了所有条件的filter方法。
相关代码:
def filter_by(self, **kwargs):
clauses = [_entity_descriptor(self._joinpoint_zero(), key) == value
for key, value in kwargs.items()]
return self.filter(sql.and_(*clauses))如果将id作为左手边的值提供,即
stmt = dbsession.query(...).join(...).filter_by(id = 123)该语句将被编译。但是,以下代码将无法编译
stmt = dbsession.query(...).join(...).filter_by(id = case_id)因为,case_id在作用域中不是一个变量
还有,操作员的版本
stmt = dbsession.query(...).join(...).filter_by(case_id = id)可以正确解析case_id,并发现当前作用域中存在名为id (内置)的内容,并尝试使用它
这应该是您想要的结果:
results = dbsession.query(
Incidents.case_num,
func.to_char(Incidents.date_time, 'FMMonth FMDD, YYYY'),
func.to_char(Incidents.date_time, 'HH24:MI'),
Incidents.incident_type,
Incidents.incident_cat,
Incidents.injury,
Incidents.property_damage,
Incidents.description,
Incidents.root_cause,
Actions.corrective_action,
Actions.due_date,
Incidents.user_id).filter(
Actions.case_id == Incidents.id
).filter(
Incidents.case_num == 123
).one()
# ^ here's how one would add multiple filters to a query仅供参考,您可以保存query对象并检查它们,如下所示:
stmt = dbsession.query(...).filter(...)
print(stmt),然后使用以下命令获取结果
stmt.one()
# or stmt.first() or stmt.all() or ...https://stackoverflow.com/questions/46097153
复制相似问题