一文搞懂sqlalchemy
SQLAlchemy 是 Python 中最流行的 ORM(对象关系映射)工具。那么什么是ORM呢
ORM
在聊 SQLAlchemy 之前,我们必须先明确一个核心概念——ORM(对象关系映射)。
ORM 的作用,就是充当 “翻译官” 和 “转换器”(两个功能):
1:把代码中的 “对象操作”(创建、修改、删除对象)自动翻译成数据库能理解的 “SQL 语句”;
2:把数据库返回的 “表行数据”自动转换成代码中能直接使用的 “对象”。
简单来说:有了 ORM,你不用再手动写 SQL,只需像操作 Python 对象一样操作数据,剩下的 “翻译” 工作全由 ORM 完成
SQLAlchemy (举一个生活中的例子)
想象你是一个水果摊老板,你的摊位就是一个数据库:
#原始方式(直接写 SQL):
-- 顾客自己翻摊位:找红色、价格低于10元的苹果
SELECT * FROM 苹果 WHERE 颜色 = '红色' AND 价格 < 10;
缺点:效率低。每次找水果都要写完整的 SQL,重复工作多
SQLAlchemy 方式:雇一个 :牛马店员(ORM 操作)
- 打开水果摊摊位:创建数据库引擎(Engine):
首先要和数据库建立连接,这一步在 SQLAlchemy 中对应 “创建引擎”。Engine是 SQLAlchemy 的核心组件,它负责管理数据库连接池,处理与数据库的底层通信,无需我们手动管理连接的建立和关闭。
from sqlalchemy import create_engine
# 连接SQLite数据库(仓库地址:“水果摊.db”)
# 若连接MySQL,地址格式为:mysql+pymysql://用户名:密码@主机:端口/数据库名
engine = create_engine('sqlite:///水果摊.db')
- 告诉店员 “水果摆放规则”:定义 “表结构”(Table + MetaData)
接下来要让店员知道仓库里的水果是怎么摆放的 —— 也就是数据库中的表结构。SQLAlchemy 用MetaData(元数据)管理所有表的信息,用Table类定义具体的表结构。支持自动加载已有表的结构(autoload_with=engine),也支持手动定义新表。
from sqlalchemy import Table, MetaData, Column, String, Float
# 初始化元数据(管理所有表的“说明书”)
metadata = MetaData()
# 方式1:自动加载已有表的结构(适合数据库已存在的情况)
苹果 = Table('苹果', metadata, autoload_with=engine)
# 方式2:手动定义新表(适合新建数据库场景,专业项目常用)
苹果 = Table(
'苹果', # 表名
metadata,
Column('id', String(20), primary_key=True), # 主键:水果编号
Column('颜色', String(10)), # 字段1:颜色
Column('价格', Float), # 字段2:价格
Column('产地', String(20)) # 字段3:产地
)
MetaData的作用:集中管理表结构。如果后续需要修改表(比如增加 “保质期” 字段),只需在Table定义中添加Column,再执行metadata.create_all(engine),SQLAlchemy 会自动处理表的更新(避免手动写ALTER TABLE语句)
3. 让店员取水果:执行 “查询操作”:
用 Python 代码拼接查询条件,不用写纯 SQL。这里我们用engine.connect()创建连接(Connection),通过上下文管理器(with语句)自动关闭连接,避免资源泄漏
# 从sqlalchemy导入select函数(专业写法,替代直接用Table.select())
from sqlalchemy import select
# 建立连接并执行查询(上下文管理器自动管理连接生命周期)
with engine.connect() as conn:
# 1. 拼接查询条件:找红色、价格低于10元的苹果
# 苹果.c.颜色:表示“苹果表的颜色字段”(c即column的缩写)
query = select(苹果).where(
(苹果.c.颜色 == '红色') & (苹果.c.价格 < 10)
)
# 2. 执行查询并获取结果
result = conn.execute(query)
# 3. 处理结果(支持迭代、转换为字典等)
for fruit in result:
print(f"编号:{fruit.id},颜色:{fruit.颜色},价格:{fruit.价格}元")
3.2 让店员补货:插入数据:给仓库 “补货”
with engine.connect() as conn:
# 插入一条数据
conn.execute(苹果.insert().values(
id='001',
颜色='红色',
价格=8.5,
产地='山东'
))
# 提交事务(修改操作需提交,查询无需提交)
conn.commit()
- 更高级的 ORM 模式。用 类 来管理水果(常用)
把表映射成 Python 类,直接用类的实例操作数据,更符合面向对象编程的习惯。
from sqlalchemy.orm import declarative_base, Session
# 1. 定义基类(所有ORM类的父类)
Base = declarative_base()
# 2. 定义ORM类(对应“苹果”表)
class Apple(Base):
__tablename__ = '苹果' # 绑定的表名
id = Column(String(20), primary_key=True)
颜色 = Column(String(10))
价格 = Column(Float)
产地 = Column(String(20))
# 3. 用Session操作数据(Session是ORM模式的核心,管理对象生命周期)
with Session(engine) as session:
# 插入数据:创建类实例
new_apple = Apple(id='002', 颜色='绿色', 价格=7.8, 产地='陕西')
session.add(new_apple) # 添加到会话
session.commit() # 提交事务
# 查询数据:直接查询类
red_apples = session.query(Apple).filter(
Apple.颜色 == '红色',
Apple.价格 < 10
).all() # all()获取所有结果
不用再关注表和字段,而是像操作 Python 类一样操作数据,降低代码与数据库的耦合度
总结
使用sqlalchemy可以
解耦:(隔离 Python 代码与 SQL 语法,无需关注底层数据库类型)
高效(连接池管理、自动事务处理,减少重复工作)
420

被折叠的 条评论
为什么被折叠?



