ORM框架整理
浅谈ORM:
ORM大家心里都明白是对象关系映射操作数据库,也都知道怎么去应用,但是如果让你说说他的原理和执行过程,你还能描述出来么?当然,让我说我也说不明确!所以就花了点时间,彻底的理解了下ORM框架,以下是学习心得体会!
在简述ORM框架之前,需要先明确两个点:DB first 和 code first
DB first - 手动创建数据库和表,通过框架,自动生成类 直接获取数据库的表,自动生成一大堆代码! 例子:原生SQL语句
code first - 手动创建数据库和类,通过ORM框架,自动生成表(需要手动创建数据库) 例子:ORM框架
ORM框架简介
对象-关系映射(Object-Relational Mapping,简称ORM),面向对象的开发方法是当今企业级应用开发环境中的主流开发方法,关系数据库是企业级应用环境中永久存放数据的主流数据存储系统。对象和关系数据是业务实体的两种表现形式,业务实体在内存中表现为对象,在数据库中表现为关系数据。内存中的对象之间存在关联和继承关系,而在数据库中,关系数据无法直接表达多对多关联和继承关系。因此,对象-关系映射(ORM)系统一般以中间件的形式存在,主要实现程序对象到关系数据库数据的映射。
为什么使用ORM?
当我们实现一个应用程序时(不使用O/R Mapping),我们可能会写特别多的原生数据库操作代码,以完成从数据库中保存、删除、读取对象信息的操作,论性能来说,肯定是原生SQL语句的执行是毋庸置疑的;但是不刨除一部分人写的原生SQL语句很烂执行效率不高;
再一种就是复杂的操作,需要写很多的重复代码,直接暴露一大难题:原生SQL语句拼接起来非常麻烦;而对象关系映射(Object Relational Mapping,简称ORM),主要实现程序对象到关系数据库数据的映射,通过类或对象操作数据库,大大减少重复性的代码。所以就有了这么一种数据库操作框架,不用再写SQL语句而是自动生成,所以就不用再去操作数据库,通过学习这个框架的规则,实现是数据库操作。所以ORM框架相当于中间起连接作用的一个桥梁,开发成员按照规则编写语句,框架内部会按照编写的内容自动生成SQL语句,然后去操作MySQL数据库。
ORM框架的作用,就两点:1、为用户提供简单的规则;2、代码在内部自动转换成SQL语句
对象-关系映射解释:
A . 简单:ORM以最基本的形式建模数据。比如ORM会将一个类(模型)映射成MySQL的一张表,定义的类内的字段就是这张表的列名(自上而下有序的生成列)
B . 精确:ORM使所有的自定义的类都按照统一的标准精确地映射成MySQL数据表,使系统在代码层面保持准确统一
C .易懂:ORM使数据库结构文档化。通过Python代码就能实现对数据库的操作,不用再去写原生的SQL语句,也不用再考虑执行效率的问题!
D.易用:ORM包含对持久类对象进行CRUD操作的API,例如create(), update(), save(), load(), find(), find_all(), where()等,也就是将sql查询全部封装成了编程语言中的函数,通过函数的链式组合生成最终的SQL语句。通过这种封装避免了不规范、冗余、风格不统一的SQL语句,可以避免很多人为Bug,方便编码风格的统一和后期维护。
总结:
ORM框架:
对象关系映射,通过创建一个类,这个类与数据库的表相对应!类的对象代指数据库中的一行数据。
简述ORM原理:
让用户不再写SQL语句,而是通过类以及对象的方式,和其内部提供的方法,进行数据库操作!把用户输入的类或对象转换成SQL语句,转换之后通过pymysql执行完成数据库的操作。
ORM的优缺点:
优点:
提高开发效率,降低开发成本
使开发更加对象化
可移植
可以很方便地引入数据缓存之类的附加功能
缺点:
在处理多表联查、where条件复杂之类的查询时,ORM的语法会变得复杂。就需要写入原生SQL。
示例
由于本人是一位Python搬砖工,现所熟悉语言仅Python而已,现以Python的ORM举例!!!
SQLAlchemy是python编程语言下的一款ORM框架,该框架建立在数据库API之上,使用关系对象映射进行数据库操作,简言之便是:将对象转换成SQL,然后使用数据API执行SQL并获取执行结果。
执行过程:
通过引擎(Engine)连上要操作的数据库(什么数据库?MySQL,SQLserver,MySQLDB等...),然后利用创建的类(必须继承Base基类,否则无用!)自动创建数据表,类内定义的字段对应着数据表的列,类的对象对应着数据表的一行数据。SQLAlchemy内部没有连接数据库的机制,他只负责数据的转换,而连接数据库的操作是由pymysql实现的。同时SQLAlchemy可以转换成多个数据库的语言,所以建立链接时,需要通过引擎(Engine)指定操作的数据库类型,以转换成相应的语句!
借鉴于:
http://blog.csdn.net/jianyuerensheng/article/details/50804360
http://www.cnblogs.com/wisdo/p/4279091.html