首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >SQL Alchemy join语句

SQL Alchemy join语句
EN

Stack Overflow用户
提问于 2017-09-07 21:04:07
回答 1查看 231关注 0票数 0

我在将此SQL查询转换为SQL Alchemy查询时遇到问题:

代码语言:javascript
运行
复制
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:找不到一个()的行

代码语言:javascript
运行
复制
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:映射器

代码语言:javascript
运行
复制
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()

我想我可以做两个独立的查询,但我更愿意弄清楚如何执行一个连接查询。

EN

回答 1

Stack Overflow用户

发布于 2017-09-07 23:20:26

您不需要显式地指定联接来让sqlalchemy生成您想要的语句。

另外,(我的意见)。避免使用filter_by。

在这种情况下,filter_by不够聪明,无法意识到idIncidents中的一个列,因为id是一个内置函数。filter_by (see source)接受where条件作为关键字参数,将它们解包,将键视为要查找的列,而不是值,然后调用连接了所有条件的filter方法。

相关代码:

代码语言:javascript
运行
复制
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作为左手边的值提供,即

代码语言:javascript
运行
复制
stmt = dbsession.query(...).join(...).filter_by(id = 123)

该语句将被编译。但是,以下代码将无法编译

代码语言:javascript
运行
复制
stmt = dbsession.query(...).join(...).filter_by(id = case_id)

因为,case_id在作用域中不是一个变量

还有,操作员的版本

代码语言:javascript
运行
复制
stmt = dbsession.query(...).join(...).filter_by(case_id = id)

可以正确解析case_id,并发现当前作用域中存在名为id (内置)的内容,并尝试使用它

这应该是您想要的结果:

代码语言:javascript
运行
复制
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对象并检查它们,如下所示:

代码语言:javascript
运行
复制
stmt = dbsession.query(...).filter(...)
print(stmt)

,然后使用以下命令获取结果

代码语言:javascript
运行
复制
stmt.one()
# or stmt.first() or stmt.all() or ...
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46097153

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档