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

Python SQLAlchemy ORM 数据库操作指南

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

监控大屏发布于 2026/3/22更新于 2026/7/1946 浏览

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'
     = 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=)
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. 安装
  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. 总结
  • 免费图片AI生成工具免费生成了解详情
  • Magick API 一键接入全球大模型注册送1000万token查看
  • 免费图片视频在线生成30秒,将你的创意变成现实开始设计
  • X/Twitter免费视频下载器免登陆无限额度免费视频解析下载了解详情
  • 100+免费在线小游戏爽一把
极客日志微信公众号二维码

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

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

更多推荐文章

查看全部
  • C++ 二叉搜索树(BST)原理与核心操作实现
  • 微软发布 AutoDev AI 程序员,自主完成软件工程任务性能提升 30%
  • 前端监控:别让你的应用在黑暗中运行
  • 二分查找实战:旋转数组最小值与缺失数字查找
  • 利用 Anthropic Skill 提升大模型前端设计的审美
  • SQLyog 13.1.1 安装步骤与 MySQL 连接配置指南
  • C++ 入门:引用、内联函数与 C++11 新特性详解
  • HashCat 密码破解工具入门与实战指南
  • AI 辅助开发:用 DeepSeek 构建高性能贪吃蛇游戏
  • AI 时代技术民主化:文科生的新机遇与核心优势
  • 漏洞挖掘入门教程:从零基础到精通的完整指南
  • OpenClaw 深度调教指南:5 步让 AI 助手真正能干活
  • C++ 高并发内存池:ObjectPool 构造与实现
  • DEIM在VisDrone2019无人机数据集上的实战训练与部署
  • 二分查找实战:山峰数组的峰顶索引与寻找峰值
  • AI 绘图模型推荐:Logo.Redmond Logo 生成器 LoRA
  • 大语言模型提示词调试的 6 个关键步骤
  • 基于树莓派4B与Motion搭建轻量级本地安防监控系统
  • LLaMA3 微调教程:LLaMA Factory 安装部署、模型微调与 GGUF 转换
  • Git 入门实战:配置、提交、版本回退与文件恢复

相关免费在线工具

  • 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