0

0

mysql与ORM框架有什么关系_mysql面向对象数据映射解析

P粉602998670

P粉602998670

发布时间:2026-01-14 10:56:02

|

946人浏览过

|

来源于php中文网

原创

MySQL是数据库,ORM是应用层的编程抽象,将表映射为类、行映射为对象、字段映射为属性,不改变MySQL行为;需手动建表、类型兼容、主键标记;复杂查询和性能优化仍需原生SQL。

mysql与orm框架有什么关系_mysql面向对象数据映射解析

MySQL 是数据库,ORM 是操作它的编程抽象层

MySQL 本身不提供类、对象、属性这些概念,它只认 CREATE TABLESELECTJOIN 这些 SQL 操作。ORM(Object-Relational Mapping)是写在应用代码里的中间层,比如 Python 的 SQLAlchemy、Java 的 Hibernate、Node.jsTypeORM,它们把 MySQL 中的表映射成程序里的类,把行映射成对象,把字段映射成属性。

这种映射不是 MySQL 自带的功能,也不改变 MySQL 的行为——它只是帮你少写几遍 INSERT INTO user (name, email) VALUES (?, ?) 这样的语句。

ORM 映射本质是约定 + 自动生成 SQL

SQLAlchemy 为例,定义一个 User 类并不等于创建了表:

from sqlalchemy import Column, Integer, String
from sqlalchemy.ext.declarative import declarative_base

Base = declarative_base()

class User(Base): tablename = 'user' id = Column(Integer, primary_key=True) name = Column(String(50)) email = Column(String(100))

这段代码只是声明“如果要操作 MySQL 的 user 表,就按这个结构理解”。真正建表得调用 Base.metadata.create_all(engine),它会生成并执行类似这样的 SQL:

Roboflow
Roboflow

一个为计算机视觉和机器学习提供工具和服务的平台

下载
CREATE TABLE user (
    id INTEGER PRIMARY KEY AUTO_INCREMENT,
    name VARCHAR(50),
    email VARCHAR(100)
);
  • __tablename__ 必须和 MySQL 中实际表名一致,否则查不到数据
  • Column 的类型(如 String(50))需和 MySQL 字段类型兼容,否则插入时可能被截断或报错 DataTooLongError
  • 主键字段必须显式标记 primary_key=True,否则 ORM 不知道怎么做 UPDATEDELETE

ORM 不是万能的,绕不开 MySQL 特性时就得手写 SQL

当需要利用 MySQL 独有功能时,ORM 往往力不从心:

  • JSON 字段操作:MySQL 支持 JSON_EXTRACT(user_info, '$.age'),但多数 ORM 对 JSON 类型仅支持整体读写,没法在查询条件里直接解析字段
  • 全文索引匹配:MATCH(title, content) AGAINST('python' IN NATURAL LANGUAGE MODE) 很难用 ORM 原生表达
  • 窗口函数:如 ROW_NUMBER() OVER (PARTITION BY dept ORDER BY salary DESC),部分 ORM 直到较新版本才支持,且语法晦涩
  • 锁提示:SELECT * FROM order FOR UPDATE 在事务中加行锁,ORM 的 query.get() 默认不带 FOR UPDATE,得显式调用 with_for_update()

这时候就得退回到原始 SQL:session.execute(text("SELECT ... FOR UPDATE")),或者干脆用 mysqlclient / pymysql 直连。

性能陷阱常出在 ORM 的“自动”行为上

ORM 为方便而做的默认行为,容易在 MySQL 侧引发慢查询或锁等待:

  • 懒加载(lazy loading):访问 user.posts 才去查 posts 表,看似省事,但 N+1 查询会让 MySQL 承受大量小查询压力
  • 自动事务边界:某些 ORM 在 session.commit() 时才发 SQL,若中间逻辑长、锁持有久,MySQL 的 innodb_lock_wait_timeout 可能触发超时
  • 未设 limit 的全表遍历:写 User.query.all() 却没加条件,ORM 生成 SELECT * FROM user,MySQL 扫全表+发全部结果到应用内存,OOM 风险高
  • 忽略字符集:ORM 连接配置漏设 charset=utf8mb4,MySQL 用默认 latin1 存中文,存进去是乱码,查出来还是乱码

真要压榨 MySQL 性能,最终都得看 EXPLAIN 输出、查 slow_query_log、盯 SHOW PROCESSLIST——ORM 只是起点,不是终点。

相关专题

更多
python开发工具
python开发工具

php中文网为大家提供各种python开发工具,好的开发工具,可帮助开发者攻克编程学习中的基础障碍,理解每一行源代码在程序执行时在计算机中的过程。php中文网还为大家带来python相关课程以及相关文章等内容,供大家免费下载使用。

750

2023.06.15

python打包成可执行文件
python打包成可执行文件

本专题为大家带来python打包成可执行文件相关的文章,大家可以免费的下载体验。

635

2023.07.20

python能做什么
python能做什么

python能做的有:可用于开发基于控制台的应用程序、多媒体部分开发、用于开发基于Web的应用程序、使用python处理数据、系统编程等等。本专题为大家提供python相关的各种文章、以及下载和课程。

758

2023.07.25

format在python中的用法
format在python中的用法

Python中的format是一种字符串格式化方法,用于将变量或值插入到字符串中的占位符位置。通过format方法,我们可以动态地构建字符串,使其包含不同值。php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

618

2023.07.31

python教程
python教程

Python已成为一门网红语言,即使是在非编程开发者当中,也掀起了一股学习的热潮。本专题为大家带来python教程的相关文章,大家可以免费体验学习。

1262

2023.08.03

python环境变量的配置
python环境变量的配置

Python是一种流行的编程语言,被广泛用于软件开发、数据分析和科学计算等领域。在安装Python之后,我们需要配置环境变量,以便在任何位置都能够访问Python的可执行文件。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

547

2023.08.04

python eval
python eval

eval函数是Python中一个非常强大的函数,它可以将字符串作为Python代码进行执行,实现动态编程的效果。然而,由于其潜在的安全风险和性能问题,需要谨慎使用。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

577

2023.08.04

scratch和python区别
scratch和python区别

scratch和python的区别:1、scratch是一种专为初学者设计的图形化编程语言,python是一种文本编程语言;2、scratch使用的是基于积木的编程语法,python采用更加传统的文本编程语法等等。本专题为大家提供scratch和python相关的文章、下载、课程内容,供大家免费下载体验。

706

2023.08.11

Java 桌面应用开发(JavaFX 实战)
Java 桌面应用开发(JavaFX 实战)

本专题系统讲解 Java 在桌面应用开发领域的实战应用,重点围绕 JavaFX 框架,涵盖界面布局、控件使用、事件处理、FXML、样式美化(CSS)、多线程与UI响应优化,以及桌面应用的打包与发布。通过完整示例项目,帮助学习者掌握 使用 Java 构建现代化、跨平台桌面应用程序的核心能力。

0

2026.01.14

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
MySQL 教程
MySQL 教程

共48课时 | 1.7万人学习

MySQL 初学入门(mosh老师)
MySQL 初学入门(mosh老师)

共3课时 | 0.3万人学习

简单聊聊mysql8与网络通信
简单聊聊mysql8与网络通信

共1课时 | 791人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号