Python SQLAlchemy 基础用法详解:从引擎配置到 CRUD 操作
本文以 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 入门教程,希望对大家有所帮助。如果大家有任何疑问请留言,小编会及时回复。在此非常感谢大家对本站的支持! 如果你觉得本文对你有帮助,欢迎转载,烦请注明出处,谢谢!
免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









