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

yizhihongxing

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

相关文章

  • 手把手教你利用Python创建一个游戏窗口

    我很乐意为你讲解如何利用Python创建一个游戏窗口的完整攻略。请注意,为了让回答更加易于阅读,下文将使用标题、代码块等Markdown格式进行排版。 准备工作 在创建游戏窗口之前,我们需要安装pygame库,该库可以帮助我们方便地创建游戏窗口。你可以使用以下命令在终端中安装该库: pip install pygame 安装完成后,我们可以开始创建游戏窗口了…

    Flask 2023年5月16日
    00
  • Vue+Flask实现图片传输功能

    【Vue+Flask实现图片传输功能】 本攻略将分为两条示例来详细讲解如何使用Vue和Flask实现图片传输功能。 【示例一】 在本例中,我们将使用Flask作为后端,使用Vue作为前端,来实现图片上传和展示功能。 前端Vue代码 首先,在Vue的模板中添加一个上传文件的input标签和一个展示图片的img标签,如下所示: <template> …

    Flask 2023年5月15日
    00
  • 用 Flask 实现发送电子邮件

    Flask 是一款轻量级的 Web 框架,非常适合快速开发小型 Web 应用。 在这篇文章中,我们将详细介绍如何在 Flask 应用中发送邮件。 安装 Flask-Mail 扩展 首先,我们需要安装 Flask-Mail 扩展来发送邮件。可以使用下面的命令来安装 Flask-Mail: pip install Flask-Mail 接下来,我们需要设置 Fl…

    Flask 2023年3月13日
    00
  • flask中使用蓝图将路由分开写在不同文件实例解析

    在Flask中使用蓝图将路由分开写在不同文件的过程如下: 创建蓝图对象 在Flask应用程序实例化后,我们首先需要创建一个蓝图对象,来管理我们将要拆分的路由和视图函数。我们可以在自己的代码文件中导入蓝图并创建实例: from flask import Blueprint bp = Blueprint(‘example’, __name__) 此时,bp就是我…

    Flask 2023年5月16日
    00
  • Django使用HttpResponse返回图片并显示的方法

    当我们需要在Django框架中展示一张图片或者返回一张图片时,可以使用HttpResponse将图片内容以二进制格式返回给浏览器。下面是展示如何使用HttpResponse返回图片并显示的方法的完整攻略: 方法1:读取图片文件并返回 首先在Django的视图函数中,导入以下模块: python from django.http import HttpResp…

    Flask 2023年5月16日
    00
  • 用python实现监控视频人数统计

    下面我将为你详细讲解“用Python实现监控视频人数统计”的完整攻略。 1. 前置条件 首先,我们需要准备好以下的环境: Python3 openCV库 Numpy库 在准备环境时,需要注意openCV库的版本是否与Python版本兼容。可以通过打开Python命令提示符或Anaconda上的命令行终端,输入以下命令来检查openCV库的版本: import…

    Flask 2023年5月16日
    00
  • 如何基于Python和Flask编写Prometheus监控

    如何基于Python和Flask编写Prometheus监控的攻略需要经过以下步骤: 安装Prometheus和Flask-Prometheus扩展包 定义需要监控的metrics指标 编写Flask应用程序 启动Flask应用程序并暴露metrics 启动Prometheus并对Flask应用进行监控 下面,我将逐步讲解每个步骤。 1. 安装Prometh…

    Flask 2023年5月15日
    00
  • Python的Flask框架及Nginx实现静态文件访问限制功能

    讲解一下Python的Flask框架及Nginx如何实现静态文件访问限制功能的完整攻略。 1. Flask框架 1.1 Flask框架介绍 Flask是一款基于Python语言的轻量级Web框架,其主要特点是简单易学、灵活、可扩展以及具有良好的文档支持。Flask框架的主要功能包括路由映射、请求处理、会话管理、模板引擎等。 1.2 Flask框架安装 安装F…

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