【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 ...
随机推荐
- ubuntu搭建mediawiki
1.搭建lamp环境,lamp指的是: Linux+Apache+Mysql/MariaDB+Perl/PHP/Python (我们安装的是Linux+apache2+postgresql+php) ...
- B. Tell Your World
http://codeforces.com/contest/849/problem/B 题目是给出n个点,要求把这n个点分成两组,每组都是一条直线.而且这两组不能为空,还要是平行的. 思路: 对于前3 ...
- Java文件与io——RandomAccessFile
RandomAccessFile是IO包的类,从Object直接继承而来.只可以对文件进行操作,可以对文件进行读取和写入.RandomAccessFile有强大的文件读写功能,其内部是大型byte[] ...
- Docker | 第零章:前言
说在前面 对于一个后端开发者而言,对于Docker也是前年十月份才开始听说的(很惭愧,Docker在2013年就已经出现了).当时有个新项目启动,领导们在技术选型时,在部署方面选定的是Docker.那 ...
- spring mvc 注解扫描问题 ,扫描不到controller, use-default-filters="false"
今天搭了个spring mvc项目,怎么也扫描不到controller,最后发现问题在use-default-filters="false"上面,乱copy出的问题 (默认值是tr ...
- 记ubuntu下安装Anaconda
晚上尝试在ubuntu 16.04版本下安装python的Anaconda3发行版. 从清华源下载的Anaconda3-Linux 64位版本安装包,然后顺利的下一步,下一步.....一切顺利!结果到 ...
- Ionic 解决gradle下载慢的问题
问题 使用Ioinc添加安卓平台或者编译的时候,提示gradle-XXX-all.zip下载,此进度缓慢. 解决 下载gradle对应的zip文件. 参考资源:http://services.grad ...
- 2019年我的nodejs项目选型
选型项目比较激进.发现基于 go 语言的工具变多了.
- Handler: Service中使用Toast
Handler 的使用在 android App 开发中用的颇多,它的作用也很大,使用 Handler 一般也会使用到多线程,相信大家对 Handler 不会陌生,在这里,重点说一下 android ...
- CentOS 6.0 系统 LAMP(Apache+MySQL+PHP)安装步骤
一.安装 MySQL 首先来进行 MySQL 的安装.打开超级终端,输入: [root@localhost ~]# yum install mysql mysql-server 安装完毕,让 MySQ ...