Python ORM框架SQLAlchemy学习笔记之关系映射实例

yizhihongxing

Python ORM框架SQLAlchemy学习笔记之关系映射实例

什么是ORM框架

ORM (Object Relational Mapping) 即对象关系映射,是通过使用描述对象和数据库之间映射的元数据,将面向对象语言程序中的对象自动持久化到关系型数据库中。

ORM框架的优点:

  • ORM框架能够消除常见的 SQL 注入问题,提高代码的安全性。
  • ORM框架主要支持多种非常流行的数据库,包括MySQL, PostgreSQL等,具有很强的兼容性。
  • ORM框架能够使程序的可维护性和可重用性更高,程序员更注重开发业务逻辑而非SQL查询。

SQLAlchemy概述

SQLAlchemy是Python语言的开源ORM框架之一,使用Apache License 2.0发行。它实现了大部分的SQL92标准,包括如何声明关系、联结、执行原始SQL语句等。

SQLAlchemy提供两个主要的工具:SQLAlchemy Core和SQLAlchemy ORM,其中SQLAlchemy Core为SQLAlchemy提供了一些底层的SQL执行工具,而SQLAlchemy ORM则提供了一个通过关系映射为面向对象程序设计的QLAPI。

至于为什么要使用SQLAlchemy ORM,以下几点原因:

  • 抽象数据库操作以及 Model 层,风格类似 Django ORM 但不限于 django 的使用范围;
  • 持有一个 SQL 核心,提供了一个直接使用原生 SQL 语句的实现方式;
  • 提供更加可控的事务会话,避免除了自己业务意愿之外引入多余的事务阻塞等。

SQLALchemy与ORM花式查询

SQLAlchemy提供了两种主要方式来进行查询:

  • 通过SQLAlchemy Core;
  • 通过SQLAlchemy ORM。

这里我们选择通过SQLAlchemy ORM的方式来进行查询。SQLAlchemy ORM的查询方式可以分为基础查询和高级查询两种方式。

基础查询

基础查询通过select()函数来构建查询语句,常用的过滤器方法包括:

  • filter():通过指定条件来选择性返回结果;
  • filter_by():通过指定字段和值来选择性返回结果;
  • first():返回第一条记录;
  • one():返回第一条且保证只有一条记录,否则抛出异常。

示例:

from sqlalchemy import create_engine, Column, Integer, String
from sqlalchemy.ext.declarative import declarative_base

engine = create_engine('mysql+pymysql://root:123456@localhost/test?charset=utf8', 
                       echo=True, encoding='utf-8')

Base = declarative_base()

class User(Base):
    __tablename__ = 'user'
    id = Column(Integer, primary_key=True)
    name = Column(String(32))
    age = Column(Integer)

from sqlalchemy.orm import sessionmaker

DBSession = sessionmaker(bind=engine)

session = DBSession()

# 基础查询示例
result = session.query(User).first()
print(type(result))
print(result.name)

高级查询

高级查询可以通过filter()、filter_by()等方法和运算符操作来实现复杂的查询,SQLAlchemy ORM还提供了类似原生SQL语句的查询方式。常用的方法包括:

  • group_by():对查询结果进行分组;
  • having():对查询结果进行过滤;
  • order_by():对查询结果进行排序;
  • limit()和offset():用于分页。

示例:

# 高级查询示例1
result = session.query(User).filter(User.name == 'aaron').filter(User.age == 20).all()

# 高级查询示例2
from sqlalchemy import func
result = session.query(User.name, func.count('*').label('count')).group_by(User.name).all()

# 高级查询示例3
from sqlalchemy.orm import aliased
a1 = aliased(User)
a2 = aliased(User)
result = session.query(a1.name, a2.name).filter(a1.age > a2.age).all()

示例1表示查询名字为aaron,并且年龄为20岁的所有用户;示例2表示查询用户按名字分组,并统计每组用户数量;示例3表示查询年龄比自己小的用户,并将这些结果按照名字进行聚合。在示例3中,我们使用了一个新的技术:Aliased对象来生成一个User表的副本,并用副本来实现查询比当前用户年龄小的用户。

总结

本文介绍了Python ORM框架SQLAlchemy的查询方式,并提供了基础查询和高级查询两种具体示例。如果你是Python开发者,想要借助一个强大、灵活且兼容多种数据库的ORM框架来完成你的数据库开发,那么SQLAlchemy肯定是一个不错的选择。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Python ORM框架SQLAlchemy学习笔记之关系映射实例 - Python技术站

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

相关文章

  • 如何通过python实现人脸识别验证

    我们可以通过Python和OpenCV库来实现人脸识别验证。以下是完整的攻略步骤: 步骤一:安装所需库 首先要安装必要的Python库,包括: OpenCV Pillow numpy 你可以使用以下命令来安装这些库: pip install opencv-python pip install Pillow pip install numpy 步骤二:准备训练…

    人工智能概论 2023年5月25日
    00
  • 基于Python实现人脸识别和焦点人物检测功能

    下面我将详细讲解“基于Python实现人脸识别和焦点人物检测功能”的完整攻略。 准备工作 在实现人脸识别和焦点人物检测功能之前,我们需要准备以下工作: 安装Python环境 安装必要的Python第三方库:OpenCV、face_recognition、Pillow等 获取人脸识别和焦点人物检测的训练数据集(可以在网上下载) 实现方式 人脸识别 步骤一:读取…

    人工智能概览 2023年5月25日
    00
  • Python实现异步IO的示例

    Python实现异步IO可以使用asyncio模块来实现。以下是Python实现异步IO的完整攻略: 什么是异步IO 异步IO是一种非阻塞式的IO模型,在这种模型中,一个应用程序可以在执行IO操作时,同时处理其他任务。相对于传统的同步IO模型,异步IO模型可以更大程度地提高程序的整体性能。 asyncio模块 Python提供了asyncio模块来支持异步I…

    人工智能概论 2023年5月25日
    00
  • 在 .NET Core 中使用 Diagnostics (Diagnostic Source) 记录跟踪信息

    在 .NET Core 中,我们可以使用 Diagnostics(Diagnostic Source)来自定义记录跟踪信息。其主要原理是,在关键时刻发送一个事件,将事件传递给监听器,从而实现跟踪记录。整个流程可以分为三个步骤: 定义属性事件源 Diagnostics 中的每个事件源都需要定义一个类,在这个类中,我们可以定义多个属性来描述该事件。假设我们要在示…

    人工智能概览 2023年5月25日
    00
  • Springcloud hystrix服务熔断和dashboard如何实现

    Spring Cloud Hystrix是一个用于处理服务的延迟和容错的库。在分布式系统中,许多依赖项可以导致故障。因此,我们需要一种机制来管理与这些服务的交互。Hystrix提供了一种解决方案:通过熔断,隔离和降级来控制分布式系统性能。 下面是实现Spring Cloud Hystrix服务熔断和Dashboard的完整攻略: 步骤一:添加Hystrix依…

    人工智能概览 2023年5月25日
    00
  • Nginx服务器高性能优化的配置方法小结

    下面我将详细讲解“Nginx服务器高性能优化的配置方法小结”: Nginx服务器高性能优化的配置方法小结 一、使用Nginx Gzip压缩功能 Nginx可以对输出进行压缩,减小传输量,优化网站性能,这个功能需要更改Nginx默认配置文件(/etc/nginx/nginx.conf)。如下: gzip on; gzip_min_length 1k; gzip…

    人工智能概览 2023年5月25日
    00
  • 解决python 打包成exe太大的问题

    当我们把Python程序打包成.exe文件时,可能会遇到打包后的文件太大的问题。解决办法是使用一些第三方工具进行压缩和优化。下面是解决Python打包成.exe太大问题的完整攻略。 1. 通过PyInstaller压缩 PyInstaller是一个易于使用的打包工具,可以将Python程序打包成独立的可执行文件,包括Windows、Linux和Mac OS …

    人工智能概览 2023年5月25日
    00
  • Win10 KB5006670无法卸载怎么办?KB5006670卸载不掉的解决方法

    好的。首先需要说明的是,KB5006670是Windows 10的一个累积更新补丁,是为了修复系统中的一些漏洞和问题所发布的,如果出现了无法卸载的问题,我们可以尝试以下解决方法: 方法一:使用Windows Update卷积清理工具 Windows Update卷积清理工具可以帮助我们删除旧的Windows更新和卸载KB5006670等更新,以下是具体操作过…

    人工智能概览 2023年5月25日
    00
合作推广
合作推广
分享本页
返回顶部