Python SQLAlchemy 基础用法详解:从引擎配置到 CRUD 操作

拾柒
拾柒
发布时间:2026-10-14 | 4人浏览过
原创

本文以 MySQL 为例,详细介绍 Python 2.7 环境下 SQLAlchemy 1.1.6 的基本用法。内容涵盖 ORM 概念、Engine 与 Session 的配置、数据模型定义,以及通过 query 和 session 实现数据的增删改查操作。重点解析 filter 与 filter_by 的区别、批量插入性能对比及事务提交机制,帮助开发者快速掌握 SQLAlchemy 的核心功能。

Python SQLAlchemy 基础介绍

本文以 MySQL 数据库为例,演示 SQLAlchemy 的基础使用方法。文中使用的 Python 版本为 2.7,SQLAlchemy 版本为 1.1.6。

一、介绍

SQLAlchemy 是 Python 生态中最著名的 ORM(对象关系映射)工具之一。

关于 ORM 的概念:

ORM 的全称是 Object Relational Mapping(对象关系映射)。

其核心特点是直接操作 Python 对象而非编写 SQL 查询语句。这种编程方式让开发者在代码层面专注于对象逻辑,而非 SQL 语法,从而体现程序化思维,使 Python 代码更加简洁且易于阅读。

具体实现上,它将数据库中的表映射为 Python 类,将数据列映射为类的属性,将数据库操作映射为类的方法。

使用 ORM 的主要优点包括:

  • 简洁易读:通过将数据表抽象为对象(数据模型),代码结构更直观。
  • 可移植性:封装了多种数据库引擎,面对不同数据库时操作逻辑基本一致,便于代码维护。
  • 安全性:能有效避免 SQL 注入攻击。

为什么要选择 SQLAlchemy?

尽管其执行性能略低于原生 SQL 语句,但使用它操作数据库非常便捷,能显著提升开发效率。

环境配置与连接建立

二、具体使用指南

核心概念与数据类型

关键概念解析

概念 对应数据库 说明
Engine 连接 驱动引擎
Session 连接池,事务 由此开始查询
Model 表 类定义
Column 列
Query 若干行 可以链式添加多个条件

常见数据类型映射

数据类型 数据库数据类型 python数据类型 说明
Integer int int 整形,32位
String varchar string 字符串
Text text string 长字符串
Float float float 浮点型
Boolean tinyint bool True / False
Date date datetime.date 存储时间年月日
DateTime datetime datetime.datetime 存储年月日时分秒毫秒等
Time time datetime.datetime 存储时分秒

创建数据库表

1. 安装步骤

pip install SQLalchemy

2. 建立数据库连接


from sqlalchemy import create_engine

engine = create_engine("mysql://user:password@hostname/dbname?charset=uft8")

上述代码初始化并创建了 Engine 对象。Engine 内部维护了一个 Pool(连接池)和一个 Dialect(方言解析器),其中 Dialect 用于识别具体连接的数据库类型。

当 Engine 创建完成后,Pool 和 Dialect 也随之生成,但此时并未真正建立数据库连接。只有当执行具体语句如 .connect() 时,才会实际连接到数据库。

create_engine 函数还支持其他可选参数,例如:


engine = create_engine("mysql://user:password@hostname/dbname?charset=uft8",
            echo=True,
            pool_size=8,
            pool_recycle=60*30
            )
  • echo:设置为 True 时,会将 ORM 语句转换为 SQL 语句并打印输出,通常用于调试阶段。
  • pool_size:设置连接池的大小,默认值为 5;若设置为 0,则表示连接数无限制。
  • pool_recycle:设置一个时间值,用于限制数据库连接在无活动多久后自动断开。

数据模型定义与表创建

3. 创建数据库表类(模型)

前文提到 ORM 的核心特点,即通过操作对象来操作表。下面我们以常见的用户表为例,创建一个对应的类:


from sqlalchemy.ext.declarative import declarative_base
Base = declarative_base()
class Users(Base):
  __tablename__ = "users"

  id = Column(Integer, primary_key=True)
  name = Column(String(64), unique=True)
  email = Column(String(64))
  def __init__(self, name, email):
    self.name = name
    self.email = email 

declarative_base() 是 SQLAlchemy 内部封装的一个方法,用于构造一个基类。该基类及其子类可以将 Python 类与数据库表进行关联映射。

数据库表模型类通过 __tablename__ 属性与表名关联,Column 则用于定义数据表的列。

4. 生成数据库表

Base.metadata.create_all(engine)

执行上述代码创建表,若表已存在则忽略。运行后,可以在数据库中观察到 users 表的创建。

Session 管理与数据 CRUD 操作

数据操作

表结构创建完成后,即可进行数据操作。常见的增删改查(CRUD)操作将逐一介绍。

Session 会话管理

在 SQLAlchemy 中,Session 用于创建程序与数据库之间的会话,所有对象的加载和保存都必须通过 Session 对象完成。

可以通过 sessionmaker 调用创建一个工厂函数,并关联 Engine,以确保每个 Session 都能使用该 Engine 连接资源:


from sqlalchemy.orm import sessionmaker

# 创建session
DbSession = sessionmaker(bind=engine)
session = DbSession()

Session 的常见操作方法包括:

  • flush:预提交,将数据提交到数据库文件,但尚未正式写入数据库。
  • commit:提交一个事务。
  • rollback:回滚事务。
  • close:关闭会话。

增加数据(Insert)

以下是一个最简单的添加示例:


add_user = Users("test", "test123@qq.com")
session.add(add_user)
session.commit()

session.add() 会将 Model 对象加入当前 Session 维护的持久化空间(可通过 session.dirty 查看),直到执行 commit 时才正式提交到数据库。

Q1:在 add 之后如何直接获取对象的属性?

可以在 add 之后执行 db.session.flush(),这样便可在 Session 中获取到对象的属性值。

Q2:如何进行批量插入,性能对比如何?

批量插入主要有以下几种方法,对其批量处理性能进行了比较,结果如下:

session.add_all() < bulk_save_object() < bulk_insert_mappings() < SQLAlchemy_core()

查询数据(Select)

查询是最常用的操作之一,以下是一个最简单的查询示例:


users = session.query(Users).filter_by(id=1).all()
for item in users:
  print(item.name)

通常我们通过上述查询模式获取数据。需要注意的是,通过 session.query() 查询返回的是一个 Query 对象,此时并未真正去数据库中查询。只有当执行 .all()、.first() 等具体函数时,才会真正执行数据库操作。

其中,query 提供了 filter 和 filter_by 两种过滤方法,上述例子也可以改写为:


users = session.query(Users).filter_by(Users.id == 1).all()

通常这两个方法都会用到,因此务必掌握它们的区别:

filter

filter_by 支持所有比较运算符,相等比较使用 ==;仅支持使用 "="、"!=" 和 "><";过滤时使用类名.属性名;不支持组合查询,只能连续调用 filter 变相实现;参数为 **kwargs,支持组合查询,支持 and、or 和 in 等逻辑。

修改数据(Update)

更新数据有两种方法,第一种是使用 query 中的 update 方法:

filter filter_by
支持所有比较运算符,相等比较用比较用== 只能使用"=","!="和"><"
过滤用类名.属性名 过滤用属性名
不支持组合查询,只能连续调用filter变相实现 参数是**kwargs,支持组合查询
支持and,or和in等

修改数据

更新数据有两种方法,第一种是使用 query 中的 update 方法:


session.query(Users).filter_by(id=1).update({'name': "Jack"})

另一种是直接操作对应的表模型:


users = session.query(Users).filter_by(name="Jack").first()
users.name = "test"
session.add(users)

这两种方式中,一般批量更新时我会选择前者;而需要对查询获取的对象属性进行修改后再更新的场景,则需要使用后者。

删除数据(Delete)

与更新数据类似,删除数据也有两种方法,第一种:


delete_users = session.query(Users).filter(Users.name == "test").first()
if delete_users:
  session.delete(delete_users)
  session.commit()

第二种:


session.query(Users).filter(Users.name == "test").delete()
session.commit()

批量删除时推荐使用第二种方法。

以上即为 Python SQLAlchemy 的基本用法总结。

完整代码可参考:我的 GitHub 仓库

总结

以上所述是小编给大家介绍的 Python SQLAlchemy 入门教程,希望对大家有所帮助。如果大家有任何疑问请留言,小编会及时回复。在此非常感谢大家对本站的支持! 如果你觉得本文对你有帮助,欢迎转载,烦请注明出处,谢谢!

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表