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(类型, 选项):对应字段
  • 常用类型:Integer、String(n)、DateTime、Boolean、Float
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()
相关推荐
对空六课1 小时前
两个统计平台数据不同:用同一时间窗和事件样本做差异定位
大数据·前端·网络·数据库
wno7046 小时前
postgresSQL压缩版安装与基本命令
数据库·postgresql
聚美智数8 小时前
智能结构化识别-图片结构解析-图像结构化解析-照片结构化解析
android·java·数据库
瀚高PG实验室8 小时前
瀚高数据库常用系统表查询入门指南(附常用SQL)
数据库·sql·postgresql·瀚高数据库
ben9518chen9 小时前
mysql数据库基本操作
数据库·mysql
2603_965148119 小时前
电商选品调研:通过关键词搜索API获取市场热销商品,结合商品详情API分析竞品卖点与定价
开发语言·数据库·人工智能·python·信息可视化
土豆.exe9 小时前
nf_tables 的 verdict 被读了两次:一个十年未闭合的位域错配
java·数据库·网络安全·缓存
缓慢更新10 小时前
表单引擎的存储建模:宽表与文档库的取舍
运维·服务器·网络·数据库·低代码·oracle·适配器模式
Web3&Basketball11 小时前
实测Gemini4Argon:ERQA 87%登顶长程任务榜
数据库·python·大模型·多模态·gemini·长上下文·推理优化
xiaogai_gai11 小时前
金蝶收料通知单查询策略实战教程:从源系统拉取到中间层落地的完整路径
java·前端·数据库