flask的orm框架SQLAlchemy查询实现解析

下面我会详细讲解如何使用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技术站

(0)
上一篇 2023年5月15日
下一篇 2023年5月15日

相关文章

  • 挺进地牢EPIC版全道具获取方式 全道具效果一览

    挺进地牢EPIC版全道具获取方式及效果攻略 一、全道具获取方式 游戏中的道具通常分为两类:奖励和商店购买。以下是全道具的获取方式: 关卡奖励:完成挑战关卡后,可能获得一些随机道具奖励,其中包含秘密地牢的门钥匙、宝箱钥匙、增益药水以及攻击力、防御力、血量等属性提升道具; 商店购买:在游戏中有两个商店,一个是起点商店,一个是大智慧商店,它们都会出售一些道具,包括…

    Flask 2023年5月16日
    00
  • Flask接收上传图片方法实现

    下面是Flask接收上传图片的完整攻略。 准备工作 首先,我们需要先安装Flask的插件Flask-Uploads,可以通过pip直接安装,命令如下: pip install Flask-Uploads 安装完成后,在Flask的应用中引入该插件: from flask_uploads import UploadSet, configure_uploads,…

    Flask 2023年5月16日
    00
  • Python的Flask框架中使用Flask-Migrate扩展迁移数据库的教程

    一、介绍 Flask-Migrate是Flask框架中的一个扩展,用于数据库迁移。在使用Flask时,为了保证数据结构和表与每个环境中的需求的一致性,需要在更新迭代时改变数据库结构。 二、安装 在开始使用Flask-Migrate之前,需要先安装。 1.使用pip安装 pip install Flask-Migrate 2.在requirements.txt…

    Flask 2023年5月15日
    00
  • 哪种Python框架适合你?简单介绍几种主流Python框架

    哪种Python框架适合你? Python是一种高级编程语言,根据 TIOBE编程语言排行榜,Python是全球使用最广泛的第三种编程语言。Python具有简单易学和广泛的应用领域,如web开发、数据挖掘、机器学习、游戏开发等。 Python编程具有很强的灵活性,但是在开发大型应用程序或者组织复杂的代码库时会变得混乱不堪,并且难以维护。随着Python语言的…

    Flask 2023年5月15日
    00
  • 一文带你学会Python Flask框架设置响应头

    以下是详细的Python Flask框架设置响应头攻略。 什么是响应头? 在HTTP协议中,请求和响应分别由请求头和响应头两部分组成。其中,响应头包含一些元信息,用于描述响应中所包含的实体,如数据类型、编码方式等。 Flask框架设置响应头 在Python Flask框架中,设置响应头非常简单。可以通过Flask框架提供的make_response()函数手…

    Flask 2023年5月16日
    00
  • 详解Python Flask API 示例演示(附cookies和session)

    详解Python Flask API 示例演示(附cookies和session) 在此文中,我们将为您详细讲解如何使用Python Flask构建API,并附上cookies和session示例。文中包含以下两条示例: 访问API并设置cookies API使用session来记录登录状态 访问API并设置cookies 如果您要访问API并在浏览器中设置…

    Flask 2023年5月15日
    00
  • Flask接口如何返回JSON格式数据自动解析

    当Flask使用JSON格式返回数据时,可自动将JSON转换为Python对象,以便于后续操作。下面是详细的攻略过程: Flask如何返回JSON格式数据 在Flask中使用jsonify函数来返回JSON格式的数据对象,如下所示: from flask import jsonify @app.route(‘/api/data’, methods=[‘POS…

    Flask 2023年5月16日
    00
  • Flask框架debug与配置项的开启与设置详解

    让我详细讲解一下“Flask框架debug与配置项的开启与设置详解”的完整攻略。这篇攻略将分为两部分:一是debug模式的开启与设置,二是Flask配置项的介绍与设置。 一、Debug模式 1.1 Debug模式的作用 Debug模式是Flask框架中非常重要的一项功能,它可以帮助我们快速定位到出现错误的代码,并提示出错原因。在开发阶段中,通常都会开启Deb…

    Flask 2023年5月16日
    00
合作推广
合作推广
分享本页
返回顶部