杰瑞科技汇

Python SQLAlchemy教程如何快速上手?

SQLAlchemy 教程:从入门到精通

SQLAlchemy 是 Python 中最强大、最流行的 SQL 工具包和对象关系映射器,它为开发者提供了两个主要的使用模式:

Python SQLAlchemy教程如何快速上手?-图1
(图片来源网络,侵删)
  1. ORM (Object Relational Mapping):以面向对象的方式操作数据库,你定义 Python 类,SQLAlchemy 会自动将其映射到数据库表,你通过操作对象来间接操作数据库,这是最常用、最方便的模式。
  2. Core (Core):提供一套 Pythonic 的、基于 Python 表达式的语言来构建 SQL 语句,它更接近原生 SQL,提供了更大的灵活性和性能控制。

本教程将主要围绕更常用的 ORM 模式展开,并在最后简要介绍 Core 模式。


目录

  1. 第一部分:核心概念与安装

    • 什么是 SQLAlchemy?
    • 安装 SQLAlchemy
    • SQLAlchemy 的核心组件:Engine, Connection, Session
  2. 第二部分:ORM 基础操作

    • 定义模型
    • 创建数据库表
    • 增删改查
      • 创建与添加
      • 查询
      • 更新与删除
  3. 第三部分:进阶查询

    Python SQLAlchemy教程如何快速上手?-图2
    (图片来源网络,侵删)
    • filter() vs. filter_by()
    • 排序与分页
    • 关系
      • 一对多
      • 多对一
      • 多对多
  4. 第四部分:Core 模式简介

    • Table, Column, MetaData
    • 构建 select 语句
  5. 第五部分:最佳实践与总结

    • 代码结构建议
    • 资源管理

第一部分:核心概念与安装

什么是 SQLAlchemy?

SQLAlchemy 是一座桥梁,连接了 Python 对象世界和 SQL 数据库世界,它让你不必手写复杂的 SQL 语句,而是用 Python 的类和方法来完成数据库操作,这极大地提高了开发效率和代码的可维护性。

安装 SQLAlchemy

使用 pip 进行安装:

Python SQLAlchemy教程如何快速上手?-图3
(图片来源网络,侵删)
pip install SQLAlchemy

SQLAlchemy 的核心组件

在深入代码之前,必须理解三个核心组件:

  • Engine (引擎):这是 SQLAlchemy 与数据库交互的核心,它管理着与数据库的连接池,负责处理连接的创建和销毁,你只需要创建一次 Engine 对象。

  • Connection (连接):由 Engine 提供,代表一个与数据库的实时连接,通常你不需要直接操作它,而是通过更高层级的 Session。

  • Session (会话):这是 ORM 交互的主要“接口”,它维护一个对象映射到数据库记录的“身份映射”,并跟踪所有待执行的增删改操作,你可以把它想象成一个“工作区”,你在这个工作区里操作对象,然后通过 commit() 将这些操作一次性提交到数据库。

一个简单的比喻:

  • Engine 是一家工厂。
  • Session 是工厂里的一个车间。
  • 对象 是车间里的工人。
  • commit() 就是把车间里完成的工作成品运出去。

第二部分:ORM 基础操作

定义模型

模型是一个 Python 类,它继承自 sqlalchemy.ext.declarative.declarative_base,这个类中的属性会自动映射为数据库表的列。

import os
from sqlalchemy import create_engine, Column, Integer, String
from sqlalchemy.orm import sessionmaker
from sqlalchemy.ext.declarative import declarative_base
# 1. 创建一个基础类
Base = declarative_base()
# 2. 定义一个模型类 (User)
class User(Base):
    __tablename__ = 'users'  # 指定数据库表名
    id = Column(Integer, primary_key=True)
    name = Column(String)
    fullname = Column(String)
    age = Column(Integer)
    def __repr__(self):
        return f"<User(name='{self.name}', fullname='{self.fullname}', age={self.age})>"
# 3. 创建数据库连接 (Engine)
# 这里使用 SQLite 作为示例,它是一个文件型数据库,无需额外安装服务器
# 'sqlite:///tutorial.db' 表示在当前目录下创建一个名为 tutorial.db 的数据库文件
engine = create_engine('sqlite:///tutorial.db')
# 4. 创建表 (如果表不存在)
Base.metadata.create_all(engine)
print("数据库表 'users' 已创建。")

运行这段代码后,你的项目目录下会生成一个 tutorial.db 文件,这就是你的数据库。

创建数据库表

上面的代码中,Base.metadata.create_all(engine) 会检查所有继承自 Base 的模型,并根据模型的定义在数据库中创建对应的表,如果表已经存在,它不会重复创建。

增删改查

创建与添加

我们需要一个 Session 来操作数据库。

# ... (接上面的代码)
# 5. 创建一个 Session
Session = sessionmaker(bind=engine)
session = Session()
# 6. 创建新用户对象
user1 = User(name='Alice', fullname='Alice Smith', age=30)
user2 = User(name='Bob', fullname='Bob Johnson', age=25)
# 7. 将对象添加到会话
# 这些对象处于 "pending" 状态,还没有真正写入数据库
session.add(user1)
session.add(user2)
# 8. 提交会话
# 这会将所有 "pending" 状态的对象操作发送到数据库,执行 INSERT 语句
session.commit()
print("用户已添加到数据库。")

查询

查询是 ORM 最强大的功能之一。

# ... (接上面的代码)
# 查询所有用户
all_users = session.query(User).all()
print("\n--- 所有用户 ---")
for user in all_users:
    print(user)
# 查询特定条件的用户
# 使用 filter() 进行条件过滤
print("\n--- 名为 Alice 的用户 ---")
alice = session.query(User).filter_by(name='Alice').first() # .first() 只取第一个结果
print(alice)
# 使用 filter() (更强大,支持复杂的表达式)
print("\n--- 年龄大于 28 的用户 ---")
older_users = session.query(User).filter(User.age > 28).all()
for user in older_users:
    print(user)
# 获取单个列
print("\n--- 只获取用户名 ---")
names = session.query(User.name).all()
print(names) # 输出: [('Alice',), ('Bob',)]

更新与删除

更新和删除操作通常遵循一个模式:先查询,再修改,最后提交。

# ... (接上面的代码)
# 更新
# 1. 查询要更新的对象
bob_to_update = session.query(User).filter_by(name='Bob').first()
# 2. 修改对象的属性
if bob_to_update:
    bob_to_update.age = 26
    print(f"\n--- 更新 Bob 的年龄为 {bob_to_update.age} ---")
# 3. 提交更改
session.commit()
# 删除
# 1. 查询要删除的对象
alice_to_delete = session.query(User).filter_by(name='Alice').first()
# 2. 从会话中删除
if alice_to_delete:
    session.delete(alice_to_delete)
    print(f"\n--- 删除 Alice ---")
# 3. 提交更改
session.commit()
# 验证删除
print("\n--- 删除后的所有用户 ---")
remaining_users = session.query(User).all()
for user in remaining_users:
    print(user)

第三部分:进阶查询

filter() vs. filter_by()

  • filter_by():

    • 使用关键字参数,如 filter_by(name='Alice')
    • 只支持简单的 比较。
    • 更简洁,但功能有限。
  • filter():

    • 使用标准的 Python 运算符,如 filter(User.name == 'Alice')
    • 支持复杂的表达式,如 User.age > 25, User.name.like('A%'), ~User.name.in_(['Bob', 'Charlie'])
    • 功能更强大,是推荐使用的查询方式。

排序与分页

from sqlalchemy import desc
# 假设我们有更多用户
session.add_all([
    User(name='Charlie', fullname='Charlie Brown', age=35),
    User(name='David', fullname='David Copperfield', age=28)
])
session.commit()
# 排序
print("\n--- 按年龄升序排列 ---")
users_by_age_asc = session.query(User).order_by(User.age).all()
for user in users_by_age_asc:
    print(user)
print("\n--- 按年龄降序排列 ---")
users_by_age_desc = session.query(User).order_by(desc(User.age)).all
分享:
扫描分享到社交APP
上一篇
下一篇