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

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日

相关文章

  • Python3数字求和的实例

    Python3数字求和的实例是一个非常简单的程序,但它很好地展示了Python语言的一些关键特性。下面我来详细讲解这个程序的实现方法: 程序的实现方法 我们将使用Python解释器来运行这个程序,主要有以下两个步骤: 打开Python解释器:许多操作系统都已经默认安装了Python解释器,输入python3并按下回车键即可打开它。 编写Python代码:使用…

    人工智能概论 2023年5月25日
    00
  • ubuntu18.04安装搜狗拼音的简易教程

    下面是“Ubuntu 18.04安装搜狗拼音的简易教程”的完整攻略。 确定Ubuntu的版本 首先,确定你的Ubuntu版本是否为18.04,可以通过执行以下命令来检查: lsb_release -a 如果你的Ubuntu版本为18.04,则继续下一步。 下载搜狗拼音 在搜狗拼音Linux官网下载适用于Ubuntu的deb安装包。 安装依赖 安装搜狗拼音之前…

    人工智能概览 2023年5月25日
    00
  • Windows设置nginx开机自启动的方法

    当我们使用 Windows 操作系统来配置 Nginx 服务器时,每次重启系统时都需要手动启动 Nginx,非常麻烦。因此,设置 Nginx 开机自启动是非常必要的。下面是 Windows 设置 Nginx 开机自启动的完整攻略: 第一步:创建一个 Nginx 开机启动的 .bat 文件 在任何一个地方创建一个新的文本文件,比如说在桌面上。 将下面这行命令复…

    人工智能概览 2023年5月25日
    00
  • Python实现计算AUC的示例代码

    当我们需要度量一个分类模型的性能时,我们经常会使用一些指标,比如准确率,召回率和F1-Score等。其中,AUC (Area Under the ROC Curve) 指标比较适合用于分类器在非平衡(不同类别样本数量有差别)数据集上进行评价。本文将会提供一个Python示例,展示如何使用一些常用的Python库来计算模型的AUC。 实现AUC的计算 要计算A…

    人工智能概论 2023年5月25日
    00
  • 浅谈一下Nginx性能优化

    浅谈一下Nginx性能优化 Nginx是流行的Web服务器和反向代理,它可以有效地处理高并发的请求。但是,在实际应用中,我们需要进行一些性能优化以确保Nginx的最佳性能。本文将介绍一些Nginx性能优化的注意事项和实现方法,包括: 启用gzip压缩 启用HTTP2 调整Nginx缓冲区 使用缓存加速静态文件 启用gzip压缩 启用gzip压缩可以减少传输数…

    人工智能概览 2023年5月25日
    00
  • Perl使用nginx FastCGI环境做WEB开发实例

    Perl使用nginx FastCGI环境做WEB开发实例 简介 本文将介绍如何使用Perl语言,在nginx FastCGI环境下进行WEB开发的全部流程。其中包括环境配置、代码实现、调试方式等方面的内容。 环境配置 在开始WEB开发前,我们需要配置开发环境。详细的配置步骤如下: 安装Perl 在Ubuntu系统下,运行以下命令即可安装: shell su…

    人工智能概览 2023年5月25日
    00
  • TensorFlow获取加载模型中的全部张量名称代码

    获取加载模型中的全部张量名称是TensorFlow常见的操作之一,下面是我为你整理的一份详细攻略: 1. 直接使用tf.GraphKeys TensorFlow提供了tf.GraphKeys集合来组织模型中的各种张量名称,使用tf.get_collection()函数即可获取集合中的所有张量名称。代码如下: import tensorflow as tf #…

    人工智能概论 2023年5月25日
    00
  • Python中在for循环中嵌套使用if和else语句的技巧

    Python中的for循环结构可以嵌套if和else语句,这使得代码的灵活性增加了不少。在这里,我们将为大家详细讲解如何在Python中嵌套使用if和else语句。 为什么使用for循环中嵌套if和else语句 在处理数据集等需要遍历的数据结构时,经常需要在循环内使用if和else结构来筛选符合条件的数据。嵌套使用if和else语句可以进一步判断符合条件的数…

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