Python中的ORM——SQLAlchemy

后端操作数据库

在后端开发中常常需要操作数据库进行增删改查,一共有三种操作数据库的方式

1. 原生 SQL(最底层)

直接写 SQL 语句,发给数据库执行。
连表结构定义都不用 ,数据库里有表就能操作,代码里只认表名字符串字段名字符串

2. DB Utils / Database Core(半封装)

不是 ORM,只是把 SQL 包装成方法 ,不用拼接字符串。

直接用 Table 对象定义表结构(也可动态生成)

比如:

  • Python:SQLAlchemy Core
  • Java:JdbcTemplate
  • Go:database/sql
优点
  • 比原生安全
  • 比 ORM 灵活
  • 适合复杂查询
示例(伪代码)
复制代码
select(table).where(user.c.id == 1)
3. ORM(最主流、最常用)

把数据库表 → 变成代码里的 "对象"

不用写 SQL,直接操作对象。

优点
  • 开发极快
  • 代码优雅
  • 防 SQL 注入
  • 跨数据库(换库不用改代码)
示例(伪代码)
复制代码
user = User.get(id=1)  # 自动生成 SQL

下面重点介绍ORM

全称 Object Relational Mapping (对象关系映射),是一种把数据库表映射成编程语言对象的技术,让你不用写原生 SQL,直接用面向对象方式操作数据库。

ORM 就是中间翻译官:

  • ↔ 数据库
  • 对象 ↔ 表中的一行数据
  • 对象属性 ↔ 表的字段

你只需要操作对象,ORM 自动帮你生成并执行 SQL。

在Python中FastAPI 框架在操作数据库时常用的ORM为SQLAlchemy


SQLAlchemy

SQLAlchemy 是 Python 生态最主流、功能最完善的 ORM 框架,分为两大核心部分:

  1. ORM(高层) :用类和对象操作数据库
  2. Core(底层):用 Python 语法写 SQL,灵活度极高

它支持 MySQL、PostgreSQL、SQLite、Oracle 等所有主流数据库。

核心概念(必须懂)
  1. Engine(引擎):数据库连接入口,管理连接池
  2. Base(基类):所有模型类都继承它
  3. Model(模型) :对应数据库
  4. Column(字段) :对应表的
  5. Session(会话):操作数据库的 "手柄",增删改查都靠它

进行数据库操作的常规流程

1. 第一步:创建引擎 + 基类 + Session(固定模板)

这是每个项目都一模一样的初始化代码

复制代码
from sqlalchemy import create_engine
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import sessionmaker

# 1. 数据库连接 URL
# SQLite: "sqlite:///./test.db"
# MySQL:  "mysql+pymysql://user:password@localhost/dbname"
SQLALCHEMY_DATABASE_URL = "sqlite:///./mydb.db"

# 2. 创建引擎
engine = create_engine(
    SQLALCHEMY_DATABASE_URL,
    connect_args={"check_same_thread": False}  # SQLite 专用
)

# 3. 基类(所有模型都要继承它)
Base = declarative_base()

# 4. Session 工厂(用来和数据库会话)
SessionLocal = sessionmaker(autocommit=False, autoflush=False, bind=engine)

平时开发,这一段直接复制到 database.py

2. 第二步:写模型类(对应数据库表)

有几张表写几个类 ,类继承 Base

复制代码
from sqlalchemy import Column, Integer, String, DateTime
from datetime import datetime

class User(Base):
    __tablename__ = "users"  # 数据库表名

    id = Column(Integer, primary_key=True, index=True)
    name = Column(String(50), nullable=False)
    email = Column(String(100), unique=True, index=True)
    age = Column(Integer)
    created_at = Column(DateTime, default=datetime.utcnow)
  • __tablename__:对应库里的表名
  • Column(类型, 选项):对应字段
  • 常用类型:IntegerString(n)DateTimeBooleanFloat
3. 第三步:建表(第一次运行用一次)
复制代码
# 放在主程序入口运行一次即可
Base.metadata.create_all(bind=engine)

执行后,数据库自动生成 users 表。

4. 第四步:获取 Session(操作数据库必须有)
复制代码
db = SessionLocal()

用完记得 db.close()

5. 日常 CRUD(最常用,背下来)
🔹 增(Create)
复制代码
user = User(name="张三", email="zhangsan@example.com", age=20)
db.add(user)
db.commit()

# 拿到自增 id
print(user.id)
🔹 查(Read)
复制代码
# 查所有
all_users = db.query(User).all()

# 按 id 查(单个)
user = db.query(User).get(1)

# 条件查询
user = db.query(User).filter_by(email="zhangsan@example.com").first()

# 模糊查询
users = db.query(User).filter(User.name.like("%张%")).all()

# 分页
users = db.query(User).offset(0).limit(10).all()
🔹 改(Update)
复制代码
user = db.query(User).get(1)
if user:
    user.age = 21
    db.commit()
🔹 删(Delete)
复制代码
user = db.query(User).get(1)
if user:
    db.delete(user)
    db.commit()
相关推荐
音视频工程实战3 分钟前
PromptQL 新手入门与实战指南
数据库·sql·算法
清川渡水15 分钟前
NL2SQL 的正确打开方式:从「AI 猜 SQL」到「置信度闭环」的工程化落地
数据库·人工智能·sql
TDengine (老段)29 分钟前
TDengine Go 与 Rust 连接器 — 高性能异步访问
大数据·数据库·物联网·golang·rust·时序数据库·tdengine
东方佑1 小时前
MA-RMSNorm:打破“缩放换智能”的魔咒,大模型归一化的一次范式革命!
数据库·人工智能·计算机视觉
云和恩墨1 小时前
「云帆计划·长沙站」活动成功举办,云和恩墨与紫薇垣和湖南金悦科技分别签约并授牌,本地伙伴生态建设加速
数据库·科技
千维百策6662 小时前
如何管理错误预算:提升服务可靠性与 SLO 达成率的实践经验
服务器·网络·数据库
Y3815326623 小时前
2026 年 7 月,SERP API 调用的稳定性实战:超时、重试、降级
开发语言·数据库·人工智能·php
sugar__salt3 小时前
向量数据库从零到实战:用 Milvus + Zilliz 构建 AI 日记语义检索系统
数据库·人工智能·embedding·milvus·rag·zilliz
Gauss松鼠会4 小时前
Prometheus 实现 openGauss 的指标监控(二)Prometheus 中添加 openGauss指标
网络·数据库·oracle·prometheus·opengauss·经验总结
Cloud云卷云舒4 小时前
PolarDB(阿里云)VS HaishanDB(海山数据库,移动云)的AI能力全面对比
数据库·阿里云·ai-native·polardb·haishandb