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)则是独立于上下文的,可以在任何时候使用。
我的每一篇文章都希望帮助读者解决实际工作中遇到的问题!如果文章帮到了您,劳烦点赞、收藏、转发!您的鼓励是我不断更新文章最大的动力!