Python中ORM(对象关系映射)的概念与实操---连接数据库

一、ORM是什么

ORM(Object-Relational Mapping)对象关系映射,它是一种程序设计技术,简单来讲就是把数据库的表映射成→编程语言中的类。数据行→对象、字段→属性。

让开发者可以用面向对象的方式操作对象,而非直接编写 SQL 语句,由 ORM 框架自动将对象的操作转换为数据库的 CRUD(增删改查)操作。

二、为什么要有ORM框架?

  • 在 ORM 出现前,开发者操作数据库的方式是「手写 SQL + 手动映射数据」,存在明显痛点:
  • 语言不统一:代码是面向对象思想,SQL语言是面向关系思想,思维切换成本高
  • 重复工作量大:每次查询都要将数据库返回的行数据切换成对象,插入更新又要将对象切换成SQL列字段。
  • 数据库耦合高:不同数据库SQL语法存在差异,切换数据库需要大规模修改SQL
  • 易出错:手写 SQL 容易出现语法错误、注入漏洞、字段名拼写错误等问题;
  • 维护成本高:SQL 散落在代码中,后期修改、优化、审计难度大

三、ORM框架具体怎么操作?

首先要知道主流的ORM 框架:

Django ORM (快速开发)和 SQLAlchemy 我常用的是SQLAlchemy(灵活通用)

通过定义「模型类」映射数据库表,再调用框架提供的 API 完成数据库操作(无需手写 SQL)。

SQLAlchemy为例,详细讲解从环境搭建到 CRUD 操作的完整流程。

①安装SQLAlchemy

pip install sqlalchemy

②初始化连接与基类

创建conf_db.py文件,

建立数据库链接、

创建异步引擎(管理连接池)

创建会话工厂(生成会话)

封装依赖函数(自动管理会话生命周期)

③定义模型类

④核心操作(CRUD)

conf_db.py文件

python 复制代码
from sqlalchemy.ext.asyncio import create_async_engine, AsyncSession
from sqlalchemy.ext.asyncio import async_sessionmaker

# 数据库UR
ASYNC_DATABASE_URL = "mysql+aiomysql://root:root@localhost:3307/orm_db?charset=utf8mb4"
# 创建异步引擎
async_engine = create_async_engine(
    ASYNC_DATABASE_URL,
    echo=True,  # 可选:输出SQL日志
    pool_size=10,  # 设置连接池中保持的持久连接数
    max_overflow=20  # 设置连接池允许创建的额外连接数
)
# 创建异步会话工厂
AsyncSessionLocal = async_sessionmaker(
    bind=async_engine,
    class_=AsyncSession,
    expire_on_commit=False
)

# 依赖项,用于获取数据库会话
async def get_database():
    async with AsyncSessionLocal() as session:
        try:
            yield session
            await session.commit()
        except Exception:
            await session.rollback()
            raise
        finally:
            await session.close()

这段代码是 SQLAlchemy 异步操作 MySQL 数据库的基础配置:

  • 先导入异步引擎、会话及会话工厂等核心组件,定义包含连接信息的 MySQL 异步连接 URL;
  • 接着创建异步数据库引擎,配置连接池参数并开启 SQL 日志,再基于该引擎创建异步会话工厂,指定会话类型和提交后数据有效性规则;
  • 最后封装一个异步依赖函数,为调用方提供独立的数据库会话,同时自动处理事务提交、异常回滚及会话关闭,保障数据库连接的安全复用和操作的异常安全。
相关推荐
BOB-wangbaohai1 分钟前
软考-系统架构师-数据库系统(二)
数据库·数据分析·软考·系统架构师
冉冰学姐2 分钟前
SSM校园人才市场391d8(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面
数据库·开题报告·java 开发·ssm 框架应用
橘橙黄又青1 小时前
redis复习(2)
数据库·redis·缓存
计算机毕设VX:Fegn08958 小时前
计算机毕业设计|基于springboot + vue医院设备管理系统(源码+数据库+文档)
数据库·vue.js·spring boot·后端·课程设计
Mr__Miss8 小时前
保持redis和数据库一致性(双写一致性)
数据库·redis·spring
Knight_AL9 小时前
Spring 事务传播行为 + 事务失效原因 + 传播行为为什么不用其他模式
数据库·sql·spring
倔强的石头_9 小时前
时序数据时代的“存储与分析困局”解析及金仓解决方案
数据库
计算机毕设VX:Fegn08959 小时前
计算机毕业设计|基于springboot + vue小型房屋租赁系统(源码+数据库+文档)
数据库·vue.js·spring boot·后端·课程设计
倔强的石头_10 小时前
场景化落地指南——金仓时序数据库在关键行业的应用实践
数据库
SelectDB10 小时前
驾驭 CPU 与编译器:Apache Doris 实现极致性能的底层逻辑
运维·数据库·apache