跳到主要内容
极客日志极客日志面向AI+效率的开发者社区
首页博客GitHub 精选镜像AI 生图工具UI配色美学隐私政策关于联系
搜索内容 / 工具 / 仓库 / 镜像...⌘K搜索
注册
博客列表
Python

Python ORM 框架:SQLAlchemy 完全指南

Python ORM 框架 SQLAlchemy 的核心概念、安装及基本使用方法。内容包括 Engine、Session、Model 等组件详解,展示了增删改查(CRUD)操作、事务管理与回滚机制。此外还涵盖了连接池配置、上下文管理器使用及自动建表注意事项,旨在帮助开发者掌握 SQLAlchemy 进行高效数据库交互。

字节跳动发布于 2026/3/29更新于 2026/7/2145 浏览
Python ORM 框架:SQLAlchemy 完全指南

在 Python 开发中,数据库操作是不可避免的重要环节。直接使用原生 SQL 虽然灵活,但容易出错且维护困难。SQLAlchemy 作为 Python 中最流行的 ORM(对象关系映射)框架,为我们提供了优雅的数据库操作方式。

一、什么是 SQLAlchemy?

SQLAlchemy 是一个功能强大的 Python SQL 工具包和 ORM 框架。它提供了完整的数据库抽象层,让我们可以用面向对象的方式操作数据库,而不需要直接编写复杂的 SQL 语句。

主要特点:

  • 数据库无关性:支持多种数据库(MySQL、PostgreSQL、SQLite 等)
  • 灵活性:既支持高层 ORM,也支持底层 SQL 表达式
  • 高性能:优化的查询执行和连接池管理
  • 丰富的功能:事务管理、连接池、迁移等

二、安装 SQLAlchemy

pip install sqlalchemy

三、核心概念

1. Engine(引擎)

Engine 是 SQLAlchemy 与数据库通信的核心组件,负责连接数据库和执行 SQL 语句。

from sqlalchemy import create_engine # 创建引擎 engine = create_engine('sqlite:///example.db') # MySQL 示例:create_engine('mysql+pymysql://user:password@host:port/dbname')

2. Session(会话)

Session 是 ORM 与数据库交互的主要接口,用于执行查询和管理事务。

from sqlalchemy.orm import sessionmaker Session = sessionmaker(bind=engine) session = Session()

3. Model(模型)

Model 是数据库表在 Python 中的对象表示,通过类来定义表结构。

四、SQLAlchemy 的基本使用

1.基本用法

通过一个完整的示例来了解 SQLAlchemy 的基本用法:

from sqlalchemy import create_engine, Column, Integer, String, DateTime from sqlalchemy.ext.declarative import declarative_base from sqlalchemy.orm import sessionmaker from datetime import datetime # 创建基类 Base = declarative_base() # 定义用户模型 class User(Base): __tablename__ = 'users' id = Column(Integer, primary_key=True, autoincrement=True) username = Column(String(50), unique=True, nullable=False) email = Column(String(100), unique=True, nullable=False) created_at = Column(DateTime, default=datetime.utcnow) def __repr__(self): return f"<User(username='{self.username}', email='{self.email}')>" # 创建数据库引擎 engine = create_engine('sqlite:///example.db', echo=True) # 创建表 Base.metadata.create_all(engine) # 创建会话 Session = sessionmaker(bind=engine) session = Session() # 创建用户 new_user = User(username='alice', email='[email protected]') session.add(new_user) session.commit() # 查询用户 users = session.query(User).all() for user in users: print(user) # 关闭会话 session.close()

2.数据操作

增加数据

# 单条插入 user = User(username='bob', email='[email protected]') session.add(user) session.commit() # 批量插入 users = [ User(username='user1', email='[email protected]'), User(username='user2', email='[email protected]') ] session.add_all(users) session.commit()

查询数据

# 基本查询 users = session.query(User).all() first_user = session.query(User).first() user_by_id = session.query(User).get(1) # 条件查询 active_users = session.query(User).filter(User.is_active == True).all() user_by_email = session.query(User).filter(User.email == '[email protected]').first() # 复杂查询 from sqlalchemy import and_, or_, not_ # AND 条件 users = session.query(User).filter( and_(User.is_active == True, User.username.like('%alice%')) ).all() # OR 条件 users = session.query(User).filter( or_(User.username.like('%alice%'), User.email.like('%example%')) ).all() # 排序和限制 recent_users = session.query(User).order_by(User.created_at.desc()).limit(10).all() # 分页查询 page = 1 per_page = 20 users = session.query(User).offset((page-1)*per_page).limit(per_page).all()

更新数据

# 更新单条记录 user = session.query(User).filter(User.id == 1).first() if user: user.email = '[email protected]' session.commit() # 批量更新 session.query(User).filter(User.is_active == False).update({ User.is_active: True }) session.commit()

删除数据

# 删除单条记录 user = session.query(User).filter(User.id == 1).first() if user: session.delete(user) session.commit() # 批量删除 session.query(User).filter(User.is_active == False).delete() session.commit()

五、事务管理

SQLAlchemy 提供了多种事务管理方式,主要包括事务的开启、提交和回滚等操作。

1.事务的开启

在 SQLAlchemy 中,事务通常在执行数据库操作时自动开启。当使用 ORM 进行数据库操作时,SQLAlchemy 会自动管理事务的生命周期。

2.事务的提交

事务提交是指将事务中的所有操作永久保存到数据库中。在 SQLAlchemy 中,可以通过 session.commit() 方法来提交当前事务。提交成功后,事务所做的所有更改将永久保存在数据库中。

3.事务的回滚

当事务执行过程中出现错误或者需要取消操作时,可以使用回滚功能。通过 session.rollback() 方法,可以撤销当前事务中的所有操作,使数据库恢复到事务开始前的状态。回滚是保证数据一致性的重要手段。

4.完整示例

from sqlalchemy import create_engine, Column, Integer, String from sqlalchemy.ext.declarative import declarative_base from sqlalchemy.orm import sessionmaker from datetime import datetime # 创建数据库连接 engine = create_engine('sqlite:///example.db', echo=True) Base = declarative_base() # 定义模型 class User(Base): __tablename__ = 'users' id = Column(Integer, primary_key=True, autoincrement=True) username = Column(String(50), unique=True, nullable=False) email = Column(String(100), unique=True, nullable=False) created_at = Column(DateTime, default=datetime.utcnow) # 创建表 Base.metadata.create_all(engine) # 创建会话工厂 Session = sessionmaker(bind=engine) # 创建会话 session = Session() try: # 开始事务 user = User(username='transaction_user', email='[email protected]') session.add(user) # 提交事务 session.commit() print("Transaction completed successfully") except Exception as e: # 回滚事务 session.rollback() print(f"Transaction failed: {e}") finally: session.close()

六、上下文管理器

SQLAlchemy 的上下文管理器提供了一种优雅的方式来管理数据库会话和事务,通过 with 语句实现,确保资源在使用后被正确清理和释放,即使在发生异常的情况下也是如此。在 SQLAlchemy 中,上下文管理器主要用于管理会话的生命周期和事务边界。

from contextlib import contextmanager from sqlalchemy import create_engine, Column, Integer, String from sqlalchemy.ext.declarative import declarative_base from sqlalchemy.orm import sessionmaker from datetime import datetime # 创建数据库连接 engine = create_engine('sqlite:///example.db', echo=True) Base = declarative_base() # 定义模型 class User(Base): __tablename__ = 'users' id = Column(Integer, primary_key=True, autoincrement=True) username = Column(String(50), unique=True, nullable=False) email = Column(String(100), unique=True, nullable=False) created_at = Column(DateTime, default=datetime.utcnow) # 创建表 Base.metadata.create_all(engine) # 创建会话工厂 Session = sessionmaker(bind=engine) # 创建会话 session = Session() @contextmanager def get_db_session(): session = Session() try: yield session session.commit() except Exception: session.rollback() raise finally: session.close() # 使用示例 with get_db_session() as session: user = User(username='context_user', email='[email protected]') session.add(user)

七、细节说明

1.连接池配置

SQLAlchemy 的连接池通过复用数据库连接大幅提升性能,减少创建和销毁连接的开销。它能智能管理资源、自动处理失效连接,保证应用稳定运行。

from sqlalchemy import create_engine engine = create_engine( 'mysql+pymysql://user:password@localhost/dbname', pool_size=10, # 连接池大小 max_overflow=20, # 最大溢出连接数 pool_timeout=30, # 连接超时时间 pool_recycle=3600 # 连接回收时间 )

2.自动建表

使用 SQLAlchemy 的 declarative_base 系统定义模型类时,Base.metadata.create_all(bind=engine) 方法会自动创建所有还未在数据库中创建的表。

但是,Base.metadata.create_all(engine) 必须在 class User(Base) 之后执行才能成功创建表。

这是因为:

  • 元数据收集机制:SQLAlchemy 的 Base.metadata 是一个容器,它会自动收集所有继承自 Base 的模型类的表结构信息。
  • 注册时机:只有当 Python 解释器执行完类定义语句后,这个类才会被注册到 Base.metadata 中。
  • 内部机制:当定义 class DataRecord(Base) 时,SQLAlchemy 会在 Base.metadata 中注册这个表的定义。只有注册之后,create_all() 才知道要创建哪些表。

3.数据库操作方法

对于创建的会话 db = Session(),使用 db 可以做很多操作。

(1)对象状态管理操作

db.add(instance):将一个对象实例添加到当前会话中,准备插入到数据库 db.delete(instance):标记一个对象实例为删除状态,准备从数据库中删除

(2)会话控制操作

db.flush():将当前会话中的所有挂起更改发送到数据库,但不提交事务 db.commit():提交当前事务,将所有更改永久保存到数据库 db.rollback():回滚当前事务,撤销所有未提交的更改 db.close():关闭会话,清理资源

(3)查询操作

db.query(Model):创建一个查询对象 db.execute(statement):执行原生 SQL 语句

(4)其他会话方法

db.merge(instance):将实例的状态合并到当前会话中,如果实例已在会话中则更新,否则添加 db.refresh(instance):从数据库重新加载对象的状态

4.db.add() 和 db.commit() 的区别

(1)db.add() 用于将对象添加到当前会话中,使 SQLAlchemy 开始跟踪这个对象的状态变化。当调用 session.add() 时,对象会被放入会话的待处理队列中,但此时数据并不会立即写入数据库,而是保持在内存中等待后续操作。

(2)db.commit() 则是将当前会话中的所有变更(包括添加、修改、删除等操作)真正提交到数据库的过程。执行 commit() 时,SQLAlchemy 会生成相应的 SQL 语句并执行,将内存中的变更持久化到数据库中,同时结束当前事务。

目录

  1. 一、什么是 SQLAlchemy?
  2. 二、安装 SQLAlchemy
  3. 三、核心概念
  4. 1. Engine(引擎)
  5. 2. Session(会话)
  6. 3. Model(模型)
  7. 四、SQLAlchemy 的基本使用
  8. 1.基本用法
  9. 2.数据操作
  10. 单条插入 user = User(username='bob', email='[email protected]') session.add(user) session.commit() # 批量插入 users = [ User(username='user1', email='[email protected]'), User(username='user2', email='[email protected]') ] session.add_all(users) session.commit()
  11. 基本查询 users = session.query(User).all() firstuser = session.query(User).first() userbyid = session.query(User).get(1) # 条件查询 activeusers = session.query(User).filter(User.isactive == True).all() userbyemail = session.query(User).filter(User.email == '[email protected]').first() # 复杂查询 from sqlalchemy import and, or, not # AND 条件 users = session.query(User).filter( and(User.isactive == True, User.username.like('%alice%')) ).all() # OR 条件 users = session.query(User).filter( or(User.username.like('%alice%'), User.email.like('%example%')) ).all() # 排序和限制 recentusers = session.query(User).orderby(User.createdat.desc()).limit(10).all() # 分页查询 page = 1 perpage = 20 users = session.query(User).offset((page-1)*perpage).limit(per_page).all()
  12. 更新单条记录 user = session.query(User).filter(User.id == 1).first() if user: user.email = '[email protected]' session.commit() # 批量更新 session.query(User).filter(User.isactive == False).update({ User.isactive: True }) session.commit()
  13. 删除单条记录 user = session.query(User).filter(User.id == 1).first() if user: session.delete(user) session.commit() # 批量删除 session.query(User).filter(User.is_active == False).delete() session.commit()
  14. 五、事务管理
  15. 1.事务的开启
  16. 2.事务的提交
  17. 3.事务的回滚
  18. 4.完整示例
  19. 六、上下文管理器
  20. 七、细节说明
  21. 1.连接池配置
  22. 2.自动建表
  23. 3.数据库操作方法
  24. 4.db.add() 和 db.commit() 的区别
  • 免费图片AI生成工具免费生成了解详情
  • Magick API 一键接入全球大模型注册送1000万token查看
  • 免费图片视频在线生成30秒,将你的创意变成现实开始设计
  • X/Twitter免费视频下载器免登陆无限额度免费视频解析下载了解详情
  • 100+免费在线小游戏爽一把
极客日志微信公众号二维码

微信扫一扫,关注极客日志

微信公众号「极客日志V2」,在微信中扫描左侧二维码关注。展示文案:极客日志V2 zeeklog

更多推荐文章

查看全部
  • Web 自动化测试常用函数解析与场景应用
  • 斯坦福团队被曝抄袭清华系大模型,已删库跑路,创始人回应
  • 基于西门子 TIA、PLCSIM Advanced 与 Kepware 的 Fanuc 机器人虚拟仿真调试
  • C++ 递归经典案例:汉诺塔问题详解
  • FLUX.1-dev FP8 量化模型部署与优化指南
  • PyTorch 文本引导图像生成技术与 Stable Diffusion 实践
  • Python YAML 模块实战:接口测试参数存储与配置管理
  • 构建 Vue 全局错误处理体系,实现业务与错误解耦
  • Moondream2 本地工具优化 Stable Diffusion 提示词案例对比
  • VS Code Copilot 在 Win10 WSL2 环境下连接失败问题排查
  • Stable Diffusion XL 1.0 本地部署与 Streamlit 应用开发指南
  • Copilot 和 Claude Code:我不再纠结选哪个,而是让它们协同工作
  • Spring AI 引入 Agent Skills:模块化智能体能力新范式
  • Continuable Promises 解析:C++ 构建类似 JavaScript Promise.all 组合子
  • voidImageViewer:轻量级图像查看器,支持 GIF/WEBP 动画
  • 具身智能深度解析:深度视觉如何赋予足式机器人跑酷能力
  • Midjourney 制作抖音壁纸及副业变现指南
  • Java CAS 原理与用法
  • OXC 工具发布:前端格式化与 Lint 性能大幅提升
  • OpenClaw 多 Agent 对接飞书机器人

相关免费在线工具

  • curl 转代码

    解析常见 curl 参数并生成 fetch、axios、PHP curl 或 Python requests 示例代码。 在线工具,curl 转代码在线工具,online

  • Base64 字符串编码/解码

    将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online

  • Base64 文件转换器

    将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online

  • Markdown转HTML

    将 Markdown(GFM)转为 HTML 片段,浏览器内 marked 解析;与 HTML转Markdown 互为补充。 在线工具,Markdown转HTML在线工具,online

  • HTML转Markdown

    将 HTML 片段转为 GitHub Flavored Markdown,支持标题、列表、链接、代码块与表格等;浏览器内处理,可链接预填。 在线工具,HTML转Markdown在线工具,online

  • JSON 压缩

    通过删除不必要的空白来缩小和压缩JSON。 在线工具,JSON 压缩在线工具,online