Python SQLAlchemy中的Model.query和session.query的区别您造吗?


SQLAlchemy有两种查询方式:Model.query和session.query(Model)。本文就来介绍一下二者的区别。

Model.query


Model.query是一种直接在模型类上调用的查询方式。它是通过继承自SQLAlchemy提供的基类Model而实现的。使用Model.query查询时,我们可以直接调用一些常用的查询方法,例如filter、filter_by、order_by等。这种查询方式比较简洁明了,适合在查询较为简单的情况下使用。

from flask import Flask
from flask_sqlalchemy import SQLAlchemy

app = Flask(__name__)
app.config['SQLALCHEMY_DATABASE_URI'] = 'postgresql://user:password@host:port/database'
db = SQLAlchemy(app)

class User(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.String(100))

@app.route('/')
def index():
    # 使用Model.query方式查询所有用户
    users = User.query.all()
    return 'Total users: {}'.format(len(users))

使用Model.query的好处是它的链式调用风格,可以很方便地进行多个查询条件的组合。例如,我们可以通过多次调用filter方法来添加多个过滤条件,链式调用的形式非常清晰。

session.query

session.query(Model)是通过一个Session对象进行的查询。Session对象是SQLAlchemy中关键的概念之一,它用于维护与数据库的连接,以及管理数据的会话过程。通过Session.query属性可以获取一个查询对象,然后可以根据需要进行一系列的查询操作。
 

from sqlalchemy import create_engine
from sqlalchemy.orm import sessionmaker

engine = create_engine('postgresql://user:password@host:port/database')
Session = sessionmaker(bind=engine)
session = Session()

users = session.query(User).all()
for user in users:
    print(user.name)

上述示例中,我们首先创建了一个engine对象,并使用sessionmaker绑定了该引擎。然后,通过调用session方法创建了一个Session对象。接着,我们使用session.query方法,传入User模型类作为参数,执行了查询操作,并使用遍历打印了所有的用户名。
使用session.query(Model)的好处是它的灵活性。我们可以通过调用查询对象的方法,例如filter、order_by等,来添加查询条件和排序规则。同时,我们还可以使用更多的查询方法,例如join、group_by等,来进行复杂的查询操作。

总结


综上所述,Model.query和session.query(Model)的区别如下:
1.    使用方式:Model.query直接在模型类上进行调用,而session.query(Model)则需要通过Session对象进行调用。
2.    灵活性:Model.query提供了一些常用的查询方法,可以方便地进行简单的查询操作;而session.query(Model)则更加灵活,可以进行复杂的查询操作。session.query(Model) 提供了更高的灵活性,因为它允许你在同一个查询中指定多个模型,进行连接查询等复杂操作。而 Model.query 通常只针对单个模型,尽管你可以通过它访问到 session 的其他功能(因为 Model.query 本质上是一个 Query 对象)。假设我们有两个模型:User(用户)和Order(订单),并且这两个模型之间存在关联,即一个用户可以有多个订单。例如:

# 使用session.query进行多模型查询  
results = session.query(User, Order).join(Order, User.id == Order.user_id).all()  
for user, order in results:  
    print(f"User: {user.name}, Order: {order.product_name}")

3.    链式调用:Model.query支持链式调用方法,可以方便地组合多个查询条件;而session.query(Model)则需要通过方法调用来添加查询条件。
4.    上下文依赖:Model.query是依赖于应用上下文的创建的,因此需要在正确的上下文中使用;而session.query(Model)则是独立于上下文的,可以在任何时候使用。

我的每一篇文章都希望帮助读者解决实际工作中遇到的问题!如果文章帮到了您,劳烦点赞、收藏、转发!您的鼓励是我不断更新文章最大的动力!


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

测试开发Kevin

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值