SQLAlchemy 入门与 ORM 基础:用 Python 对象操作数据库
SQLAlchemy 入门与 ORM 基础用 Python 对象操作数据库这是一篇面向新手的技术博客。很多同学一听到操作数据库就想到写 SQL但其实在 Python 里我们可以用SQLAlchemy这种 ORM 框架像操作普通 Python 对象一样去增删改查几乎不用手写 SQL。一、什么是 SQLAlchemySQLAlchemy 是 Python 里最流行的ORMObject-Relational Mapping对象关系映射框架之一。它做了一件很巧的事把 Python 里的类/对象和数据库里的表/行一一对应起来。你操作的是 Python 对象它背后帮你翻译成 SQL 去执行。当然它也允许你直接写原生 SQL 混合使用。ORM 读音小知识SQLAlchemy 里的 Alchemy 读作 /ˈælkəmi/意思是炼金术——把代码炼成数据库操作还挺形象的。为什么要用它核心优势跨数据库兼容同一套代码底层可以换 MySQL、PostgreSQL、SQLite、Oracle 等只要换驱动和连接串不用死记 SQL 语法用 Python 风格写查询可读性好类型自动转换Python 的datetime自动对应数据库的DATETIME事务 关联查询复杂操作也有成熟支持从个人项目到企业级都能用。Core 与 ORM 两大模块SQLAlchemy 的内核分两层Core核心组件底层数据库交互引擎负责 SQL 表达式构建、连接管理ORM对象关系映射架在 Core 之上的封装实现对象 ↔ 表的映射。这是我们学习的重点。五大核心概念概念作用Engine引擎核心入口管理数据库连接由连接字符串创建决定数据库类型、地址、账号密码Session会话与数据库交互的桥梁所有增删改查都通过它完成相当于一个临时连接会话Base基类所有 ORM 模型类的父类子类会自动映射成数据库里的表Model模型一个 Python 类 一张表类属性 字段类实例 一行数据Column字段定义模型属性即表字段可指定类型、主键、非空、默认值等约束二、快速开始2.1 环境准备① 安装库以 MySQL 为例其他数据库驱动见下方说明其他数据库驱动PostgreSQLpip install psycopg2-binarySQLite无需额外安装Python 自带Oraclepip install cx_Oracle安装后验证无报错即成功② 准备数据库SQLAlchemy 只建表、不建库库要自己先建好2.2 创建 Engine连接数据库连接字符串格式数据库驱动://用户名:密码主机:端口/数据库名?参数root/123456换成你自己的账号密码sqlalchemy_demo要连接的库名需提前建好echoTrue调试神器能直接看到 SQLAlchemy 帮你拼的 SQL。2.3 定义 Base 与 Model模型常用字段类型Integer→ MySQL 的 INTString(n)→ VARCHAR(n)DateTime→ DATETIMEFloat→ FLOAT / DOUBLEBoolean→ TINYINT(1)常用字段约束参数类型说明primary_keybool是否为主键autoincrementbool / str是否自增nullablebool是否允许为空默认 Trueuniquebool是否唯一约束indexbool是否建普通索引defaultAnyPython 层面的默认值server_default表达式/字符串数据库层面的默认值如now()commentstr字段注释onupdateAny更新时自动赋值ondeletestr外键删除规则CASCADE / SET NULL 等namestr数据库真实字段名不写用属性名2.4 创建数据表执行后sqlalchemy_demo库里就会多一张user表去客户端看一眼结构验证一下。2.5 第一个增 / 查示例Session所有操作都绕不开 Session创建 → 操作 → 提交 → 关闭。 更推荐with写法自动关闭会话不用手动close()2.6 快速开始练习清单把上面几步串起来你其实已经走通了完整链路初始化配置导入create_engine、declarative_base、字段类型写好连接串创建engine再declarative_base()得到Base写模型类继承Base设__tablename__用Column()照着表结构映射字段加一条数据sessionmaker(bindengine)建工厂 → 工厂() 建会话 →add(对象)→commit()→close()。三、ORM 核心操作 CRUD实战中我们通常会把配置和模型抽成独立文件避免每个脚本都写一遍。3.1 抽取通用配置sqlalchemy_config.py3.2 模型类base_model.py 之后所有脚本都from sqlalchemy_config import SessionFactory和from base_model import User即可不用重复写连接逻辑。3.3 Read查询SQLAlchemy 查询核心是query()1.x 风格或select()2.0 风格下面以query()为主。① 基础查询② 条件查询filter③ 排序 分页④ 分组查询聚合函数用到func里的count / sum / avg / max / min函数作用func.count(列)数量func.sum(列)求和func.avg(列)平均值func.max(列)最大值func.min(列)最小值 分组查询里用到的Account模型含age字段与User定义方式完全一样本文未展开你照着User写一个即可。3.4 Create新增步骤建实例 →add→commit。3.5 Delete删除步骤查到 →delete→commit。3.6 Update更新步骤查到 → 改属性 →commit。四、本章重点速记SQLAlchemy 是 Python 最流行的 ORM用对象操作数据库少写 SQL内核两层Core引擎层 ORM映射层重点学 ORM五大件Engine / Session / Base / Model / Column标准流程create_engine→ 定义模型 →Base.metadata.create_all建表 →sessionmaker建会话 → CRUD →commit查询两大风格1.x 的session.query()和2.0 的select()文档里都给了建议两种都了解别忘了commit()——不提交改动只在内存里不会进库。五、常见问题 / 踩坑Q1导入declarative_base报弃用警告文档旧写法from sqlalchemy.ext.declarative import declarative_base仍能跑但 2.0 推荐from sqlalchemy.orm import declarative_base本文已采用新写法直接用即可。Q2代码里from sqlalchemy_config import ...报错那是把配置抽到了独立文件sqlalchemy_config.py见 3.1 节。确保这个文件和你的脚本在同一目录或已加入PYTHONPATH并且里面定义了SessionFactory和Base。Q3为什么add之后查不到数据忘记session.commit()了。只有提交事务数据才会真正写入数据库。Q4用with SessionFactory() as session还需要手动close()吗不需要with结束时自动关闭比手写close()更安全。Q5query()和select()该用哪个新项目建议优先学 2.0 的select()风格配合session.execute(stmt)但大量老教程和本文的条件/排序示例用的是query()两种都看得懂才不会被卡住。