一篇吃透Python SQLAlchemy!零基础入门+实战案例+流程图(超全详解)

前言

在Python后端开发中,操作数据库几乎是刚需!原生SQL语句手写繁琐、可读性差、容易出现注入漏洞,而SQLAlchemy 作为Python最主流的ORM框架,完美解决了这些问题 🚀

本文将从零开始,带大家全方位掌握SQLAlchemy核心用法,包含环境搭建、核心原理、数据库连接、模型定义、增删改查、关联关系,全程附可直接运行的代码案例+流程图,新手也能一键看懂!

读完本文,你可以彻底摆脱原生SQL硬编码,优雅实现Python数据库操作!


一、SQLAlchemy 是什么?🤔

1.1 ORM 概念

ORM(对象关系映射):将数据库中的数据表、行数据,与Python中的类、对象做自动映射,无需手写原生SQL,通过操作Python对象即可操作数据库。

映射关系:

  • Python 类 ➡️ 数据库数据表
  • 类属性 ➡️ 数据表字段
  • 类实例对象 ➡️ 数据表一行数据

1.2 SQLAlchemy 优势

  • ✅ 跨数据库兼容:一套代码可适配MySQL、PostgreSQL、SQLite等,无需大幅修改
  • ✅ 杜绝SQL注入:底层自动参数化处理,安全性更高
  • ✅ 代码简洁优雅:面向对象编程,可读性、可维护性极强
  • ✅ 功能强大:支持事务、关联查询、复杂筛选、分页等高级操作

1.3 整体工作流程

映射

建立连接

Session提交

事务处理

定义ORM模型类

数据库表结构

创建会话Session

数据库

操作Python对象

执行数据库增删改查

数据持久化到数据库


二、环境安装🛠️

安装核心依赖,支持Python3.7+版本:

# 安装sqlalchemy核心库
pip install sqlalchemy

# 若使用MySQL,需额外安装驱动
pip install pymysql

三、核心组件详解📌

SQLAlchemy 四大核心组件,必须掌握!

  1. Engine(引擎):数据库连接核心,负责建立和数据库的连接
  2. Base(基类):所有ORM模型类的父类,用于统一映射表结构
  3. Session(会话):数据库操作核心,所有增删改查都通过会话完成
  4. Column/字段类型:定义数据表字段、约束、类型

四、完整入门案例(SQLite)💻

先使用无需安装服务的SQLite数据库,快速上手,零门槛运行!

4.1 基础初始化(引擎、基类、会话)

from sqlalchemy import create_engine
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import sessionmaker

# 1. 创建数据库引擎(SQLite本地文件数据库)
engine = create_engine("sqlite:///test.db", echo=True)  # echo=True 打印执行的SQL语句,方便调试

# 2. 创建ORM基类
Base = declarative_base()

# 3. 创建会话工厂,绑定引擎
SessionLocal = sessionmaker(autocommit=False, autoflush=False, bind=engine)

# 4. 获取会话实例
db = SessionLocal()

4.2 定义数据模型(创建数据表)

自定义用户模型类,映射user数据表:

from sqlalchemy import Column, Integer, String, DateTime
from datetime import datetime

# 自定义用户模型
class User(Base):
    # 数据表名称
    __tablename__ = "user"

    # 定义字段
    id = Column(Integer, primary_key=True, autoincrement=True, comment="主键ID")
    username = Column(String(30), nullable=False, unique=True, comment="用户名")
    age = Column(Integer, nullable=True, comment="年龄")
    email = Column(String(50), unique=True, comment="邮箱")
    create_time = Column(DateTime, default=datetime.now, comment="创建时间")

# 批量创建所有数据表(执行映射)
Base.metadata.create_all(bind=engine)
print("数据表创建成功!")

字段核心参数说明:

  • primary_key=True:主键
  • autoincrement=True:自增
  • nullable=False:非空约束
  • unique=True:唯一约束
  • default:默认值

五、核心增删改查实战🔥

基于上面的User模型,实现全套数据库CRUD操作,代码可直接运行!

5.1 新增数据(Create)

# 单条新增
user1 = User(username="张三", age=20, email="zhangsan@163.com")
db.add(user1)

# 批量新增
user_list = [
    User(username="李四", age=22, email="lisi@163.com"),
    User(username="王五", age=25, email="wangwu@163.com")
]
db.add_all(user_list)

# 提交事务(必须提交,数据才会写入数据库)
db.commit()
print("数据新增成功!")

5.2 查询数据(Read)【最常用】

支持全量查询、条件查询、模糊查询、分页、排序等操作:

# 1. 查询所有数据
all_users = db.query(User).all()
for user in all_users:
    print(f"ID:{user.id}, 用户名:{user.username}, 年龄:{user.age}")

# 2. 根据主键查询单条数据
user = db.query(User).get(1)
print("主键查询结果:", user.username if user else "无数据")

# 3. 条件查询(精准匹配)
user = db.query(User).filter(User.username == "张三").first()
print("条件查询:", user.age)

# 4. 多条件查询
user = db.query(User).filter(User.age >= 22, User.email.like("%163.com")).first()

# 5. 模糊查询
users = db.query(User).filter(User.username.like("%五%")).all()

# 6. 排序查询(倒序)
users = db.query(User).order_by(User.age.desc()).all()

# 7. 分页查询(page页码,limit每页条数)
page_users = db.query(User).limit(2).offset(0).all()

5.3 修改数据(Update)

修改数据需先查询、再赋值、最后提交:

# 方式1:单条数据修改
user = db.query(User).get(1)
if user:
    user.age = 21  # 修改字段值
    user.email = "zhangsan_new@163.com"
    db.commit()
    print("数据修改成功!")

# 方式2:批量条件修改
db.query(User).filter(User.age == 22).update({"age": 23})
db.commit()

5.4 删除数据(Delete)

# 方式1:删除单条数据
user = db.query(User).get(3)
if user:
    db.delete(user)
    db.commit()

# 方式2:批量条件删除
db.query(User).filter(User.username == "李四").delete()
db.commit()
print("数据删除成功!")

六、MySQL 数据库适配🔧

上面案例是SQLite,切换MySQL仅需修改引擎连接地址,其余代码完全不用改,完美体现跨库优势!

# MySQL连接格式:mysql+pymysql://账号:密码@主机:端口/数据库名
engine = create_engine(
    "mysql+pymysql://root:123456@localhost:3306/test_db",
    echo=True,
    pool_pre_ping=True,  # 自动检测连接有效性
    pool_recycle=3600  # 连接回收时间
)

⚠️ 注意:使用MySQL需提前手动创建好数据库(test_db),无需创建数据表,代码自动生成!


七、事务处理机制✅

数据库事务是开发核心!SQLAlchemy默认开启事务,出错需回滚,避免数据异常:

try:
    # 执行数据库操作
    user = User(username="小明", age=18)
    db.add(user)
    # 模拟报错
    1 / 0
    db.commit()
except Exception as e:
    # 异常回滚,撤销所有操作
    db.rollback()
    print(f"操作失败,事务回滚:{e}")
finally:
    # 关闭会话
    db.close()

八、一对多关联查询实战📎

实际开发中常用表关联,这里演示最经典的用户-文章一对多关系(一个用户对应多篇文章)

8.1 定义关联模型

from sqlalchemy.orm import relationship, ForeignKey

# 用户表(主表)
class User(Base):
    __tablename__ = "user"
    id = Column(Integer, primary_key=True, autoincrement=True)
    username = Column(String(30), nullable=False)
    # 关联文章表,反向查询
    articles = relationship("Article", back_populates="author")

# 文章表(从表)
class Article(Base):
    __tablename__ = "article"
    id = Column(Integer, primary_key=True, autoincrement=True)
    title = Column(String(100), nullable=False, comment="文章标题")
    content = Column(String(500), comment="文章内容")
    # 外键关联用户表
    user_id = Column(Integer, ForeignKey("user.id"), comment="用户ID")
    # 关联用户表
    author = relationship("User", back_populates="articles")

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

8.2 关联数据查询

# 查询用户对应的所有文章
user = db.query(User).first()
print(f"用户【{user.username}】的所有文章:")
for article in user.articles:
    print(f"文章标题:{article.title}")

# 查询文章对应的作者
article = db.query(Article).first()
print(f"文章作者:{article.author.username}")

8.3 关联关系流程图

一对多

关联

反向查询所有文章

正向查询所属用户

User表 主表

Article表 从表

user.id 主键

article.user_id 外键

User.articles

Article.author


九、常用踩坑总结⚠️

  1. 新增/修改/删除数据后,必须执行commit(),数据才会持久化
  2. 代码报错务必执行rollback()回滚事务,避免锁表
  3. MySQL连接失败优先检查:账号密码、端口、数据库是否存在、是否开启远程连接
  4. 字段默认值不生效时,检查是否设置default且已提交事务
  5. 关联查询报错,优先检查relationship和外键是否匹配

十、总结🎯

本文全覆盖讲解了SQLAlchemy核心知识点:

  1. 掌握ORM核心映射原理、四大核心组件
  2. 熟练实现 SQLite/MySQL 数据库连接、模型定义
  3. 精通全套增删改查、条件筛选、分页排序操作
  4. 掌握事务处理、一对多表关联高级用法

SQLAlchemy是Python后端(FastAPI/Flask/Django)必备技能,熟练使用可以极大提升开发效率,告别繁琐原生SQL!

💡 后续更新:SQLAlchemy多对多关联、原生SQL混合查询、批量操作、异步用法!

更多推荐