【Flask数据库】join实现复杂查询

本文介绍了Flask数据库查询中join方法的应用,包括内连接(inner join)和外连接(left join, right join)。通过实例展示了如何使用内连接查询User和对应的Article,以及如何使用outerjoin获取所有User数据,即使某些User没有关联的address对象。" 114713339,10536961,Java实现220V转5V充电适配器模式,"['Java设计模式', '适配器模式', '接口', '电压转换']

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

高级查询:

1、join方法:

join查询分为两种,一种是inner join,另一种是outer join。默认的是inner join,如果指定left join或者是right join则为outer join。
####内连接:inner join,两张被内连接的表主键不匹配时,不匹配的数据均被抛弃。
####外连接:left join是以左表为基准,连接过程中右表不匹配项会被设置为null,左表数据保留;right join是以右表为基准,连接过程中左表不匹配项会被设置为null,右表数据保留。

  • 1)通过原生sql语句实现:
select user.username,count(article.id) from user join article on user.id = article.uid group by user.id order by count(article.id) desc;
从join后的user与article中提取数据,显示不同user的article数量并以降序的方式排列出来。
  • 2)如果想要查询User及其对应的Article,则可以通过以下方式来实现(默认join为内连接):
result = session.query(User.username,func.count(Article.id)).join(Article,User.id == Article.uid).group_by(User.id).order_by(func.count(Article.id)).desc()

这是通过普通方式的实现,也可以通过join的方式实现,更加简单:

  for u,a in session.query(User,Address).join(Address).all():
    print u
    print a
  # 输出结果:
  >>> <User (id=1,name='ed',fullname='Ed Jason',password='123456')>
  >>> <Address id=4,email=ed@google.com,user_id=1>

当然,如果采用outerjoin,可以获取所有user,而不用在乎这个user是否有address对象,并且outerjoin默认为左外查询:

  for instance in session.query(User,Article).outerjoin(Article).all():
    print instance
  # 输出结果:
  (<User (id=1,name='ed')>, <Article id=4,email=ed@google.com,user_id=1>)
  (<User (id=2,name='xt')>, None)
Flask是一个轻量级的Web应用框架,它为Python开发者提供了一个简单的方式来构建Web应用程序。虽然它的核心功能相对简洁,但对于复杂SQL查询的支持,通常依赖于外部库如SQLAlchemy或Peewee等ORM(对象关系映射)工具。 在Flask中,如果你需要处理复杂的SQL查询,可以使用如下步骤: 1. 安装和配置ORM:例如,安装SQLAlchemy,`pip install Flask-SQLAlchemy` 或 `pip install peewee`。然后,在Flask应用中配置数据库连接。 2. 创建数据模型:用ORM定义你的数据模型,比如用户、文章等。每个模型对应一个数据库表。 ```python from flask_sqlalchemy import SQLAlchemy db = SQLAlchemy() class User(db.Model): id = db.Column(db.Integer, primary_key=True) name = db.Column(db.String(80), unique=True, nullable=False) # 更多字段... class Post(db.Model): id = db.Column(db.Integer, primary_key=True) title = db.Column(db.String(100), nullable=False) user_id = db.Column(db.Integer, db.ForeignKey('user.id'), nullable=False) # 更多字段... ``` 3. 执行复杂查询:使用ORM提供的查询API执行SQL,这些API会根据你的需求生成对应的SQL语句。例如,分页查询JOIN、子查询等。 ```python # 查询特定用户的所有文章,按创建时间降序排列 users_posts = User.query.join(Post).filter(User.id == some_user_id).order_by(Post.created_at.desc()).all() ``` 4. 使用事务:如果你的查询涉及到多个操作,可以使用`db.session.begin()`开始事务,然后在`db.session.commit()`提交,`db.session.rollback()`回滚。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值