一文搞懂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 操作)

  1. 打开水果摊摊位:创建数据库引擎(Engine):
    首先要和数据库建立连接,这一步在 SQLAlchemy 中对应 “创建引擎”。Engine是 SQLAlchemy 的核心组件,它负责管理数据库连接池,处理与数据库的底层通信,无需我们手动管理连接的建立和关闭。
from sqlalchemy import create_engine

# 连接SQLite数据库(仓库地址:“水果摊.db”)
# 若连接MySQL,地址格式为:mysql+pymysql://用户名:密码@主机:端口/数据库名
engine = create_engine('sqlite:///水果摊.db')
  1. 告诉店员 “水果摆放规则”:定义 “表结构”(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()
  1. 更高级的 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 语法,无需关注底层数据库类型)
高效(连接池管理、自动事务处理,减少重复工作)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值