下面我会详细讲解如何使用flask中的ORM框架SQLAlchemy进行查询,并附上两个示例。
一、什么是ORM框架?
ORM (Object-Relational Mapping) 是对象关系映射的缩写,是指通过将数据库中的关系数据转换为对象模型,将程序中的对象模型通过映射转换成关系数据。本质上,ORM框架是一种工具,用于连接Python对象和数据库表之间的对应关系,并且可以实现CRUD(Create, Read, Update, Delete)操作。
在Flask中,除了使用SQLAlchemy外还可以使用其它ORM框架,例如Peewee等。但是,SQLAlchemy是一个功能强大和广泛应用的ORM框架,也是Flask中默认的ORM框架。
二、SQLAlchemy查询实现
SQLAlchemy查询可以分为两种方式:Query和Raw SQL。
1. Query方式
Query方式是指通过SQLAlchemy构建查询对象,并使用面向对象的方式来实现数据的操作。
a. 创建查询对象
创建查询对象时需要从baseQuery对象中派生处Query对象,例如:
from flask_sqlalchemy import SQLAlchemy
db = SQLAlchemy() # 创建SQLAlchemy实例
# 创建数据模型
class User(db.Model):
__tablename__ = 'user'
id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.String(50))
age = db.Column(db.Integer)
# 创建查询对象
query = db.session.query(User)
b. 筛选条件查询
查询需要满足筛选条件,这时候需要使用filter_by或者filter方法来进行筛选:
# 方法1: filter_by
query = query.filter_by(name='jackson', age=18)
# 方法2:filter
from sqlalchemy import and_
query = query.filter(and_(User.name == 'jackson', User.age == 18))
这里使用and_函数合并多个条件,其中“User.name == 'jackson'”和“User.age == 18”为两个条件。
c. 排序查询
使用order_by方法来进行排序查询:
# 当age相同时按照id升序排列
query = query.order_by(User.age.asc(), User.id.asc())
d. 分页查询
使用limit和offset方法来进行分页查询:
# 第一页,每页条数为10
query = query.offset(0).limit(10)
# 第二页,每页条数为10
query = query.offset(10).limit(10)
e. 查询结果
最后,使用all、first、one等方法来获取查询结果。其中all返回全部结果,first返回第一个结果,而one返回一个结果或者未找到时抛出异常NoResultFound或MultipleResultsFound。
# 返回全部结果
result = query.all()
# 返回第一条结果
result = query.first()
# 返回一个结果
result = query.one()
2. Raw SQL方式
此方式是基于SQLAlchemy的SQL Expression Language实现SQL查询的方式。
sql = "SELECT * FROM table_name WHERE id = :id"
result = db.engine.execute(text(sql), {"id": 1}).fetchall()
通过这种方式可以实现高度定制的SQL查询,但容易引起SQL注入问题,非常慢。
三、示例
下面是两个使用SQLAlchemy查询实现的示例:
示例1:查询用户信息
假设有如下用户数据模型:
class User(db.Model):
__tablename__ = 'user'
id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.String(50))
age = db.Column(db.Integer)
我们需要查询年龄18岁的所有用户姓名和年龄。
Query方式实现
from sqlalchemy import and_
query = db.session.query(User.name, User.age)
query = query.filter(User.age == 18)
result = query.all()
Raw SQL方式实现
sql = "SELECT name, age FROM user WHERE age = :age"
result = db.engine.execute(text(sql), {"age": 18}).fetchall()
示例2:查询最新的文章
假设有如下文章数据模型:
class Article(db.Model):
__tablename__ = 'article'
id = db.Column(db.Integer, primary_key=True)
title = db.Column(db.String(50))
content = db.Column(db.Text)
created_at = db.Column(db.DateTime, default=datetime.now())
我们需要查询最新发布的3篇文章标题和发布时间。
Query方式实现
from sqlalchemy import desc
query = db.session.query(Article.title, Article.created_at)
query = query.order_by(desc(Article.created_at)).limit(3)
result = query.all()
Raw SQL方式实现
sql = "SELECT title, created_at FROM article ORDER BY created_at DESC LIMIT 3"
result = db.engine.execute(text(sql)).fetchall()
四、总结
以上就是SQLAlchemy查询的实现方式和两个示例的详细讲解,其中Query方式相对简单和安全,一般情况下优先使用。至于Raw SQL方式,虽然可以满足高度定制的查询需求,但需要注意SQL注入问题,而且也会相对较慢。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:flask的orm框架SQLAlchemy查询实现解析 - Python技术站