跳到主要内容
极客日志极客日志
首页博客AI提示词GitHub精选代理工具
搜索
|注册
博客列表
Python

Python SQLAlchemy ORM 数据库操作指南

综述由AI生成Python 中流行的 ORM 框架 SQLAlchemy 的使用方法。内容包括安装配置、核心概念(Engine、Session、Model)、连接数据库、定义数据模型及关系、创建表、基本 CRUD 操作、复杂查询、关系操作、事务管理及最佳实践。通过示例代码展示了如何高效灵活地进行数据库操作。

监控大屏发布于 2026/3/22更新于 2026/5/716 浏览

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(Base):
    __tablename__ = 'users'
    id = Column(Integer, primary_key=True, index=True)
    name = Column(String(50), nullable=False)
    email = Column(String(100), unique=True, index=True)
    # 定义一对多关系
    posts = relationship("Post", back_populates="author")

class Post(Base):
    __tablename__ = 'posts'
    id = Column(Integer, primary_key=True, index=True)
    title = Column(String(100), nullable=False)
    content = Column(String(500))
    author_id = Column(Integer, ForeignKey('users.id'))
    # 定义多对一关系
    author = relationship("User", back_populates="posts")
    # 定义多对多关系(通过关联表)
    tags = relationship("Tag", secondary="post_tags", back_populates="posts")

class Tag(Base):
    __tablename__ = 'tags'
    id = Column(Integer, primary_key=True, index=True)
    name = Column(String(30), unique=True, nullable=False)
    posts = relationship("Post", secondary="post_tags", back_populates="tags")

# 关联表(用于多对多关系)
class PostTag(Base):
    __tablename__ = 'post_tags'
    post_id = Column(Integer, ForeignKey('posts.id'), primary_key=True)
    tag_id = Column(Integer, ForeignKey('tags.id'), primary_key=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. 安装
  2. PostgreSQL
  3. MySQL
  4. SQLite (Python 标准库已包含,无需额外安装)
  5. 核心概念
  6. 连接数据库
  7. 创建数据库连接引擎
  8. SQLite 示例
  9. PostgreSQL 示例
  10. engine = create_engine('postgresql://username:password@localhost:5432/mydatabase')
  11. MySQL 示例
  12. engine = create_engine('mysql+mysqlconnector://username:password@localhost:3306/mydatabase')
  13. 创建会话工厂
  14. 创建会话实例
  15. 定义数据模型
  16. 创建基类
  17. 关联表(用于多对多关系)
  18. 创建数据库表
  19. 创建所有表
  20. 删除所有表
  21. Base.metadata.drop_all(bind=engine)
  22. 基本 CRUD 操作
  23. 创建数据
  24. 创建新用户
  25. 批量创建
  26. 读取数据
  27. 获取所有用户
  28. 获取第一个用户
  29. 根据 ID 获取用户
  30. 更新数据
  31. 查询并更新
  32. 批量更新
  33. 删除数据
  34. 查询并删除
  35. 批量删除
  36. 查询数据
  37. 基本查询
  38. 获取所有记录
  39. 获取特定字段
  40. 排序
  41. 限制结果数量
  42. 偏移量
  43. 过滤查询
  44. 等值过滤
  45. 模糊查询
  46. IN 查询
  47. 多条件查询
  48. 或条件
  49. 不等于
  50. 聚合查询
  51. 计数
  52. 分组计数
  53. 求和、平均值等
  54. 连接查询
  55. 内连接
  56. 左外连接
  57. 指定连接条件
  58. 关系操作
  59. 创建带关系的对象
  60. 通过关系访问
  61. 多对多关系操作
  62. 事务管理
  63. 自动提交事务
  64. 使用事务上下文管理器
  65. 嵌套事务
  66. 最佳实践
  67. 使用上下文管理器管理会话
  68. 使用示例
  69. 总结
  • 💰 8折买阿里云服务器限时8折了解详情
  • GPT-5.5 超高智商模型1元抵1刀ChatGPT中转购买
  • 代充Chatgpt Plus/pro 帐号了解详情
  • 🤖 一键搭建Deepseek满血版了解详情
  • 一键打造专属AI 智能体了解详情
极客日志微信公众号二维码

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

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

更多推荐文章

查看全部
  • 使用魔搭平台与 LLaMA Factory 进行大模型微调实操指南
  • VRChat 实时翻译工具 VRCT 安装与使用指南
  • Vivado 烧录 Flash 时出现 ILA 缺失警告 [Labtools 27-3413] 解决方法
  • VSCode 集成 GitHub Copilot 使用指南
  • 后仿 SDF 反标 Warning 描述与解决方案
  • TypeTale:免费 AIGC 视频创作工具与使用指南
  • 基于 YOLO 与大模型的无人机河道智能巡检系统设计与实现
  • OpenWebUI 通过 Pipeline 对接 Dify Workflow
  • OpenClaw 深度调优:5 步让 AI 助手从聊天变实干
  • LeetCode 第 5 题:最长回文子串
  • Stable Diffusion 生成 AI 数字人视频教程
  • Spring Cloud 入门:微服务架构与解决方案
  • Java 核心面试知识点汇总:集合、多线程、JVM 及锁机制
  • Python 连接和操作 Elasticsearch 指南
  • Jetson Orin NX 部署 Ollama 与 Llama 3.2
  • 基于 VLLM 部署 Qwen3-Embedding 模型实践
  • C++ 模板初阶:函数与类模板详解
  • 前端开发中常见的加密与编码方案解析
  • LeetCode 160 题:相交链表
  • C++ 智能指针详解:从需求到实现原理

相关免费在线工具

  • 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