【问题标题】:how left outer join in sqlalchemy?如何在 sqlalchemy 中左外连接?
【发布时间】:2019-08-10 23:27:42
【问题描述】:

我想在 sqlalchemy 中实现左外连接。 sql查询是这样的:

select * from skills left join user__skill on user__skill.skill_id=skills.id and  user__skill.user_id=4

我在 sqlalchemy 中写的是:

skills = db.session.query(Skill, User_Skill.skill_id).\
            outerjoin(User_Skill, User_Skill.skill_id==Skill.id and User_Skill.user_id==4).\
            order_by(Skill.name).all()

但它不会过滤用户并显示所有用户的技能。

如何编写这段代码?

【问题讨论】:

  • 您是否尝试过将您的 sql 与 sqlalchemy 生成的 sql 进行比较?
  • 我必须如何创建它?
  • nicolascadou.com/blog/2014/01/… 你可以只打印你的查询(没有.all())或者使用特定的sql方言来查看发送到数据库的sql。
  • 是的。是这样的:SELECT skills.id AS skills_id, skills.name_en AS skills_name_en, skills.name_fa AS skills_name_fa, user__skill.skill_id AS user__skill_skill_id FROM skills LEFT OUTER JOIN user__skill ON user__skill.skill_id = skills.id ORDER BY skills.name 生成的查询中没有user__skill.user_id=4 条件。
  • 关于为什么使用and 操作 不起作用的背景:stackoverflow.com/questions/42681231/…

标签: flask sqlalchemy outer-join


【解决方案1】:

编辑: 使用and_ from sqlalchemy 加入join 条件

from sqlalchemy import and_

skills = db.session.query(Skill, User_Skill.skill_id).\
            outerjoin(User_Skill, and_(User_Skill.skill_id==Skill.id, 
                                       User_Skill.user_id==4)).\
            order_by(Skill.name).all()

旧的错误答案(不同的结果):

使用.filter 限制您的结果。将您的查询更改为:

skills = db.session.query(Skill, User_Skill.skill_id).\
            outerjoin(User_Skill, User_Skill.skill_id==Skill.id).\
            filter(User_Skill.user_id==4).\
            order_by(Skill.name).all()

【讨论】:

  • 可能值得一提的是,答案中提出的 2 个查询会有不同的结果。
猜你喜欢
  • 2014-11-26
  • 2017-01-29
  • 2016-05-08
  • 2011-06-05
  • 2018-02-28
  • 1970-01-01
  • 2011-10-01
  • 2016-11-23
  • 2013-12-05
相关资源
最近更新 更多