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

Python SQLAlchemy ORM 数据库操作指南

Python 中使用 SQLAlchemy ORM 框架进行数据库操作的方法。内容包括安装配置、核心概念(Engine、Session、Model)、连接数据库、定义数据模型及关系、创建表、基本 CRUD 操作、复杂查询、关系操作以及事务管理。最后提供了会话管理、异常处理等最佳实践建议,帮助开发者高效构建数据持久化层。

Kubernet发布于 2026/3/27更新于 2026/10/24107 浏览

SQLAlchemy ORM 数据库操作指南

SQLAlchemy 是 Python 中最流行的 ORM(对象关系映射)框架之一,它提供了高效且灵活的数据库操作方式。本文将介绍如何使用 SQLAlchemy ORM 进行数据库操作。

安装

pip install sqlalchemy

如果需要连接特定数据库,还需安装相应的驱动程序:

# PostgreSQL
pip install psycopg2-binary
# MySQL
pip install mysql-connector-python
# SQLite (Python 标准库已包含,无需额外安装)

核心概念

  • Engine:数据库连接的引擎,负责与数据库通信
  • Session:数据库会话,管理所有持久化操作
  • Model:数据模型类,对应数据库中的表
  • Query:查询对象,用于构建和执行数据库查询

连接数据库

from sqlalchemy import create_engine
from sqlalchemy.orm import sessionmaker

# 创建数据库连接引擎
# SQLite 示例
engine = create_engine('sqlite:///example.db', echo=True)
# PostgreSQL 示例
# engine = create_engine('postgresql://username:password@localhost:5432/mydatabase')
# MySQL 示例
# engine = create_engine('mysql+mysqlconnector://username:password@localhost:3306/mydatabase')

# 创建会话工厂
SessionLocal = sessionmaker(autocommit=False, autoflush=False, bind=engine)

# 创建会话实例
session = SessionLocal()

定义数据模型

from sqlalchemy import Column, Integer, String, ForeignKey
from sqlalchemy.orm import relationship, declarative_base

# 创建基类
Base = declarative_base()

class User():
    __tablename__ = 
     = Column(Integer, primary_key=, index=)
    name = Column(String(), nullable=)
    email = Column(String(), unique=, index=)
    
    posts = relationship(, back_populates=)

 ():
    __tablename__ = 
     = Column(Integer, primary_key=, index=)
    title = Column(String(), nullable=)
    content = Column(String())
    author_id = Column(Integer, ForeignKey())
    
    author = relationship(, back_populates=)
    
    tags = relationship(, secondary=, back_populates=)

 ():
    __tablename__ = 
     = Column(Integer, primary_key=, index=)
    name = Column(String(), unique=, nullable=)
    posts = relationship(, secondary=, back_populates=)


 ():
    __tablename__ = 
    post_id = Column(Integer, ForeignKey(), primary_key=)
    tag_id = Column(Integer, ForeignKey(), primary_key=)
Base
'users'
id
True
True
50
False
100
True
True
# 定义一对多关系
"Post"
"author"
class
Post
Base
'posts'
id
True
True
100
False
500
'users.id'
# 定义多对一关系
"User"
"posts"
# 定义多对多关系(通过关联表)
"Tag"
"post_tags"
"posts"
class
Tag
Base
'tags'
id
True
True
30
True
False
"Post"
"post_tags"
"tags"
# 关联表(用于多对多关系)
class
PostTag
Base
'post_tags'
'posts.id'
True
'tags.id'
True

创建数据库表

# 创建所有表
Base.metadata.create_all(bind=engine)

# 删除所有表
# Base.metadata.drop_all(bind=engine)

基本 CRUD 操作

创建数据

# 创建新用户
new_user = User(name="张三", email="[email protected]")
session.add(new_user)
session.commit()

# 批量创建
session.add_all([
    User(name="李四", email="[email protected]"),
    User(name="王五", email="[email protected]")
])
session.commit()

读取数据

# 获取所有用户
users = session.query(User).all()

# 获取第一个用户
first_user = session.query(User).first()

# 根据 ID 获取用户
user = session.query(User).get(1)

更新数据

# 查询并更新
user = session.query(User).get(1)
user.name = "张三四"
session.commit()

# 批量更新
session.query(User).filter(User.name.like("张%"))\
    .update({"name": "张氏"}, synchronize_session=False)
session.commit()

删除数据

# 查询并删除
user = session.query(User).get(1)
session.delete(user)
session.commit()

# 批量删除
session.query(User).filter(User.name == "李四")\
    .delete(synchronize_session=False)
session.commit()

查询数据

基本查询

# 获取所有记录
users = session.query(User).all()

# 获取特定字段
names = session.query(User.name).all()

# 排序
users = session.query(User).order_by(User.name.desc()).all()

# 限制结果数量
users = session.query(User).limit(10).all()

# 偏移量
users = session.query(User).offset(5).limit(10).all()

过滤查询

from sqlalchemy import or_

# 等值过滤
user = session.query(User).filter(User.name == "张三").first()

# 模糊查询
users = session.query(User).filter(User.name.like("张%")).all()

# IN 查询
users = session.query(User).filter(User.name.in_(["张三", "李四"])).all()

# 多条件查询
users = session.query(User).filter(
    User.name == "张三",
    User.email.like("%@example.com")
).all()

# 或条件
users = session.query(User).filter(
    or_(User.name == "张三", User.name == "李四")
).all()

# 不等于
users = session.query(User).filter(User.name != "张三").all()

聚合查询

from sqlalchemy import func

# 计数
count = session.query(User).count()

# 分组计数
user_post_count = session.query(
    User.name,
    func.count(Post.id)
).join(Post).group_by(User.name).all()

# 求和、平均值等
avg_id = session.query(func.avg(User.id)).scalar()

连接查询

# 内连接
results = session.query(User, Post).join(Post).filter(Post.title.like("%Python%")).all()

# 左外连接
results = session.query(User, Post).outerjoin(Post).all()

# 指定连接条件
results = session.query(User, Post).join(Post, User.id == Post.author_id).all()

关系操作

# 创建带关系的对象
user = User(name="赵六", email="[email protected]")
post = Post(title="我的第一篇博客", content="Hello World!", author=user)
session.add(post)
session.commit()

# 通过关系访问
print(f"文章 '{post.title}' 的作者是 {post.author.name}")
print(f"用户 {user.name} 的所有文章:")
for p in user.posts:
    print(f" - {p.title}")

# 多对多关系操作
python_tag = Tag(name="Python")
sqlalchemy_tag = Tag(name="SQLAlchemy")
post.tags.append(python_tag)
post.tags.append(sqlalchemy_tag)
session.commit()

print(f"文章 '{post.title}' 的标签:")
for tag in post.tags:
    print(f" - {tag.name}")

事务管理

# 自动提交事务
try:
    user = User(name="测试用户", email="[email protected]")
    session.add(user)
    session.commit()
except Exception as e:
    session.rollback()
    print(f"发生错误:{e}")

# 使用事务上下文管理器
from sqlalchemy.orm import Session

def create_user(session: Session, name: str, email: str):
    try:
        user = User(name=name, email=email)
        session.add(user)
        session.commit()
        return user
    except:
        session.rollback()
        raise

# 嵌套事务
with session.begin_nested():
    user = User(name="事务用户", email="[email protected]")
    session.add(user)
    # 保存点
    savepoint = session.begin_nested()
    try:
        user = User(name="保存点用户", email="[email protected]")
        session.add(user)
        savepoint.commit()
    except:
        savepoint.rollback()

最佳实践

  1. 会话管理:为每个请求创建新会话,请求结束后关闭
  2. 异常处理:始终处理异常并适当回滚事务
  3. 延迟加载:注意 N+1 查询问题,使用 eager loading 优化
  4. 连接池:合理配置连接池大小和超时设置
  5. 数据验证:在模型层或应用层验证数据完整性
# 使用上下文管理器管理会话
from contextlib import contextmanager

@contextmanager
def get_db():
    db = SessionLocal()
    try:
        yield db
        db.commit()
    except Exception:
        db.rollback()
        raise
    finally:
        db.close()

# 使用示例
with get_db() as db:
    user = User(name="上下文用户", email="[email protected]")
    db.add(user)

总结

SQLAlchemy ORM 提供了强大而灵活的数据库操作方式,通过本文的介绍,您应该能够:

  1. 安装和配置 SQLAlchemy
  2. 定义数据模型和关系
  3. 执行基本的 CRUD 操作
  4. 构建复杂查询
  5. 管理数据库事务
  6. 遵循最佳实践

SQLAlchemy 还有更多高级特性,如混合属性、事件监听、自定义查询等,值得进一步探索学习。

目录

  1. SQLAlchemy ORM 数据库操作指南
  2. 安装
  3. PostgreSQL
  4. MySQL
  5. SQLite (Python 标准库已包含,无需额外安装)
  6. 核心概念
  7. 连接数据库
  8. 创建数据库连接引擎
  9. SQLite 示例
  10. PostgreSQL 示例
  11. engine = create_engine('postgresql://username:password@localhost:5432/mydatabase')
  12. MySQL 示例
  13. engine = create_engine('mysql+mysqlconnector://username:password@localhost:3306/mydatabase')
  14. 创建会话工厂
  15. 创建会话实例
  16. 定义数据模型
  17. 创建基类
  18. 关联表(用于多对多关系)
  19. 创建数据库表
  20. 创建所有表
  21. 删除所有表
  22. Base.metadata.drop_all(bind=engine)
  23. 基本 CRUD 操作
  24. 创建数据
  25. 创建新用户
  26. 批量创建
  27. 读取数据
  28. 获取所有用户
  29. 获取第一个用户
  30. 根据 ID 获取用户
  31. 更新数据
  32. 查询并更新
  33. 批量更新
  34. 删除数据
  35. 查询并删除
  36. 批量删除
  37. 查询数据
  38. 基本查询
  39. 获取所有记录
  40. 获取特定字段
  41. 排序
  42. 限制结果数量
  43. 偏移量
  44. 过滤查询
  45. 等值过滤
  46. 模糊查询
  47. IN 查询
  48. 多条件查询
  49. 或条件
  50. 不等于
  51. 聚合查询
  52. 计数
  53. 分组计数
  54. 求和、平均值等
  55. 连接查询
  56. 内连接
  57. 左外连接
  58. 指定连接条件
  59. 关系操作
  60. 创建带关系的对象
  61. 通过关系访问
  62. 多对多关系操作
  63. 事务管理
  64. 自动提交事务
  65. 使用事务上下文管理器
  66. 嵌套事务
  67. 最佳实践
  68. 使用上下文管理器管理会话
  69. 使用示例
  70. 总结

更多推荐文章

查看全部
  • Dify 基于知识库搭建智能客服问答应用详解
  • Java Web 开发基础:Spring Web MVC 核心注解详解
  • Pico 4XVR 1.10.13 安装与使用指南
  • 通义万相 2.1 结合云算力实现 AIGC 高效创作
  • 基于 Spring Boot 与 Leaflet 的省级旅游口号 WebGIS 可视化实现
  • Java 对象属性批量复制实战:BeanUtils 使用指南
  • 智能协同云图库:Redis+Caffeine 多级缓存与图片全链路优化实战
  • 步进电机在创客项目中的72变:从3D打印到智能家居的跨界实践
  • AI 绘画技术演进:从 DALL·E 系列到 Stable Diffusion 解析
  • 自动化测试面试题:Selenium 与 TestNG 核心判断题
  • Java 直播商城平台架构规划与常见营销模式解析
  • 前端实时数据刷新方案:WebSocket、轮询与后台同步
  • HDFS 常用命令与 Java API 编程实践
  • 信息安全中 4 大典型漏洞的成因分析与解决方案
  • React 与 Ant Design 4.5.4 Modal 表单验证实战
  • Web 自动化测试入门:从概念到百度搜索实战
  • Python 爬虫入门:构建简单数据抓取程序
  • Node.js npm 安装过程中 EBUSY 错误的分析与解决方案
  • Windows 家用电脑部署 Gemma3 大模型:Ollama+Open WebUI 搭建 AI 聊天室
  • ClawdBot 语音实测:Whisper tiny 在嘈杂环境下的中英文转写表现

相关免费在线工具

  • 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