【Python学习之八】ORM
ORM
什么是ORM呢?
ORM全称是:Object-Relational Mapping。即对象-关系映射,就是把关系数据库的一行映射为一个对象,也就是一个类对应一个表。这样,写代码更简单,不用直接操作SQL语句。十分方便python的Web开发。通过编写ORM框架,我们可以通过定义一个User类来操作对应的数据库表User,因此可以写出这样的代码:
# 创建实例:
user = User(id=123, name='Michael')
# 存入数据库:
user.insert()
# 查询所有User对象:
users = User.findAll()
这样,我们就可以使用OOP来操作数据库了。上述代码中,User类负责收集数据,并尝试归类出这些数据对应数据库表的映射关系,类如对应表的字段(包含名字、类型、是否为表的主键、默认值)等。它的基类负责执行操作,比如数据库的存储、读取,查找等操作,如上述的存储数据: user.insert() ,查找数据: users = User.findAll() 。元类负责分类、整理收集的数据并以此创建一些类属性(如SQL语句)供基类作为参数,其中,元类是运行时动态创建的。
元类(metaclass)
元类是动态创建类的方法一种,另一种是通过type()函数动态创建。type()
函数既可以返回一个对象的类型,又可以创建出新的类型。比如,我们可以通过type()
函数创建出Hello
类,而无需通过class Hello(object)...
的定义。使用type()动态创建类,即一个class对象,需要传入三个参数:(1)class的名称;(2)继承的父类集合;(3)class的方法名称与函数绑定,这里我们把函数fn
绑定到方法名hello
上。通过type()
函数创建的类和直接写class是完全一样的,因为Python解释器遇到class定义时,仅仅是扫描一下class定义的语法,然后调用type()
函数创建出class。
>>> def fn(self, name='world'): # 先定义函数
... print('Hello, %s.' % name)
...
>>> Hello = type('Hello', (object,), dict(hello=fn)) # 创建Hello class
>>> h = Hello()
>>> h.hello()
Hello, world.
>>> print(type(Hello))
<class 'type'>
>>> print(type(h))
<class '__main__.Hello'>
接下来,我们梳理一下:类、实例、元类的关系。我们都知道,先定义类,再创建类的实例;同理,元类和类的关系是,先定义元类,再创建类。连接起来就是:先定义metaclass,就可以创建类,最后创建实例。所以,元类(metaclass)允许你创建类或者修改类。换句话说,你可以把类看成是metaclass创建出来的“实例”。
【Python学习之八】ORM的更多相关文章
- 【Python学习之八】设计模式和异常
环境 虚拟机:VMware 10 Linux版本:CentOS-6.5-x86_64 客户端:Xshell4 FTP:Xftp4 python3.6 一.设计模式1.单例模式确保某一个类只有一个实例, ...
- Python学习路程day16
Python之路,Day14 - It's time for Django 本节内容 Django流程介绍 Django url Django view Django models Django te ...
- 180分钟的python学习之旅
最近在很多地方都可以看到Python的身影,尤其在人工智能等科学领域,其丰富的科学计算等方面类库无比强大.很多身边的哥们也提到Python非常的简洁方便,比如用Django搭建一个见得网站只需要半天时 ...
- python 之路,Day11(上) - python mysql and ORM
python 之路,Day11 - python mysql and ORM 本节内容 数据库介绍 mysql 数据库安装使用 mysql管理 mysql 数据类型 常用mysql命令 创建数据库 ...
- python学习博客地址集合。。。
python学习博客地址集合... 老师讲课博客目录 http://www.bootcdn.cn/bootstrap/ bootstrap cdn在线地址 http://www.cnblogs. ...
- Python学习笔记第十二周
目录: 数据库介绍 mysql 数据库安装使用 mysql管理 mysql 数据类型 常用mysql命令事务 索引 创建数据库 外键 增删改查表 权限 python 操作mysql ORM sqla ...
- Python 学习书籍推荐
谁会成为AI 和大数据时代的第一开发语言? 这本已是一个不需要争论的问题.如果说三年前,Matlab.Scala.R.Java 和 Python还各有机会,局面尚且不清楚,那么三年之后,趋势已经非常明 ...
- python学习笔记目录
人生苦短,我学python学习笔记目录: week1 python入门week2 python基础week3 python进阶week4 python模块week5 python高阶week6 数据结 ...
- python学习(十)元类
python 可以通过`type`函数创建类,也可通过type判断数据类型 import socket from io import StringIO import sys class TypeCla ...
随机推荐
- 禁用thinkpad触摸板的方法
控制面板----硬件和声音----设备和打印机----鼠标----ThinkPad------开启触摸板(前面的勾勾去掉)
- ros indigo install
http://wiki.ros.org/cn/indigo/Installation/Ubuntu
- Java操作Excel之POI简单例子
/** * 利用POI操作Excel表单 * * 需要jar包: * HSSF针对03及以前版本,即.xls后缀 * |---poi-3.16.jar * XSSF针对07及以后版本,即xlsx后缀 ...
- LR C语言语句复习,几个简单代码
嵌套循环 Action() { int i,j; ;i<=;i++) { ) beark; else lr_output_message("i=%d",i); ;j<= ...
- 说说C#中的enum吧
enum,就是枚举类型,它是struct,int,single,double一样,都属于值类型,从ValueType类型中派生,存储在栈中.它在被创建时,不需要分配内在空间,所以对程序的性能是有好处的 ...
- Crash日志分析
从Crash文件出发解决bug的一般步骤,分三步: a, 获取设备上的崩溃日志. b, 分析崩溃日志,找到报错位置(定位到函数和代码行数). c, 打开代码,改bug. 1, 获取设备日志 1. 在可 ...
- 使用compiz出现奔溃的一些应急办法
Linux Mint 17.1 CompizConfig is also installed by default so you can configure every aspect of Compi ...
- lazyload的使用心得
1 2 3 4 5 6 7 8 9 10 11 12 13 14 $("img.lazy").lazyload({ placeholder : "img/grey.g ...
- BZOJ4355: Play with sequence(吉司机线段树)
题意 题目链接 Sol 传说中的吉司机线段树??感觉和BZOJ冒险那题差不多,就是强行剪枝... 这题最坑的地方在于对于操作1,$C >= 0$, 操作2中需要对0取max,$a[i] > ...
- JSP对象和JavaBean
1. JSP 客户端请求 当浏览器请求一个网页时,它会向网络服务器发送一系列不能被直接读取的信息,因为这些信息是作为HTTP信息头的一部分来传送的,如下图所示: Http请求头对应的内容如下: 对应方 ...