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 日志,再基于该引擎创建异步会话工厂,指定会话类型和提交后数据有效性规则;
  • 最后封装一个异步依赖函数,为调用方提供独立的数据库会话,同时自动处理事务提交、异常回滚及会话关闭,保障数据库连接的安全复用和操作的异常安全。
相关推荐
司沐_Simuoss7 分钟前
Text to SQL系统的千层套路~
数据库·人工智能·sql·语言模型·系统架构
ptc学习者8 分钟前
验证mysql RR隔离水平,并未完全实现防止幻读的实验
数据库
qq_12498707531 小时前
基于协同过滤算法的运动场馆服务平台设计与实现(源码+论文+部署+安装)
java·大数据·数据库·人工智能·spring boot·毕业设计·计算机毕业设计
数据知道1 小时前
PostgreSQL 核心原理:读已提交与可重复读的底层实现差异(事务隔离级别)
数据库·postgresql
crossaspeed1 小时前
MySQL的MVCC
数据库·mysql
2401_857683541 小时前
为你的Python脚本添加图形界面(GUI)
jvm·数据库·python
m0_706653231 小时前
使用Python自动收发邮件
jvm·数据库·python
松涛和鸣1 小时前
DAY67 IMX6 Development Board Configuration from Scratch
数据库·postgresql·sqlserver
路由侠内网穿透.2 小时前
fnOS 飞牛云 NAS 本地部署私人影视库 MoonTV 并实现外部访问
运维·服务器·网络·数据库·网络协议
怣502 小时前
MySQL表筛选分组全解析:排序、分组与限制的艺术
数据库·mysql