python一个精简的ORM框架(廖老师的python教程)理解
2017-12-11 23:10
567 查看
虽说廖老师python教程的实战已经过了一遍(除了部署以及编写移动App),但还是很多内容不理解,尤其是ORM框架。不过最近理解了使用元类里面一个精简的ORM框架,所以分享一下理解。
精简的ORM框架在这里,元类的介绍在这里。
分析源码
从User类的编写以及实例u的创建可以得到下面的信息
类属性分别为id,name,email,password
类属性对应的属性类型为
IntegerField,StringField,StringField,StringField
类属性对应的属性值为
12345,eyewater,test@orm.org,password
User类继承于Model类
Model类的父类也是Model即为其本身(类的构造器)
再来看ModelMetaclass
cls表示当前准备创建的类的对象即User类
name表示类名即User
bases表示类继承的父类集合
attrs代表类的属性集合即User类的属性集合id,name,email,password
k的值为id,name,email,password
v的值为IntegerField,StringField,StringField,StringField
所以看的输出就像这样:
删除属性,用属性
用属性
回到Model类
getattr来获取属性值即12345,Michael,test@orm.org,my-pwd
所以输出看起来就像下面这样:
精简的ORM框架在这里,元类的介绍在这里。
分析源码
class User(Model): id = IntegerField('id') name = StringField('username') email = StringField('email') password = StringField('password') u = User(id=12345, name='eyewater', email='test@orm.org', password='password') u.save()
从User类的编写以及实例u的创建可以得到下面的信息
类属性分别为id,name,email,password
类属性对应的属性类型为
IntegerField,StringField,StringField,StringField
类属性对应的属性值为
12345,eyewater,test@orm.org,password
User类继承于Model类
class User(Model)
Model类的父类也是Model即为其本身(类的构造器)
def __init__(self, **kw): super(Model, self).init__(**kw)
再来看ModelMetaclass
def __new__(cls, name, bases, attrs): if name=='Model': return type.__new__(cls, name, bases, attrs)
cls表示当前准备创建的类的对象即User类
name表示类名即User
bases表示类继承的父类集合
attrs代表类的属性集合即User类的属性集合id,name,email,password
for k, v in attrs.items(): if isinstance(v, Field): print('Found mapping: %s ==> %s' % (k, v)) mappings[k] = v
k的值为id,name,email,password
v的值为IntegerField,StringField,StringField,StringField
所以看的输出就像这样:
Found mapping: email ==> <StringField:email> Found mapping: password ==> <StringField:password> Found mapping: id ==> <IntegerField:uid> Found mapping: name ==> <StringField:username>
for k in mappings.keys(): attrs.pop(k)
删除属性,用属性
__mappings__来保存属性和列的映射
attrs['__table__'] = name
用属性
__table__来保存表名
回到Model类
def save(self): fields = [] params = [] args = [] for k, v in self.__mappings__.items(): fields.append(v.name) params.append('?') args.append(getattr(self, k, None)) sql = 'insert into %s (%s) values (%s)' % (self.__table__, ','.join(fields), ','.join(params)) print('SQL: %s' % sql) print('ARGS: %s' % str(args))
getattr来获取属性值即12345,Michael,test@orm.org,my-pwd
所以输出看起来就像下面这样:
SQL: insert into User (id,username,email,password) values (?,?,?,?) ARGS: [12345, 'eyewater', 'test@orm.org', 'password']
相关文章推荐
- 廖老师python教程实战Day5-编写web框架理解
- 廖老师python教程实战Day3-编写ORM理解
- 使用Python编写一个简单的tic-tac-toe游戏的教程
- python orm框架sqlalchemy执行更新、删除时遇到的一个bug
- 一个Python的小例子来理解字典与while循环
- 循环神经网络教程第二部分-用python,numpy,theano实现一个RNN
- 这样讲解 yield//把一个不是很好理解的概念和一个很常见的实例联系起来,轻松引出概念【再次推荐这个Python教材】
- PYTHON教程中“编写一个Python脚本”版本一的windows版本
- 深入理解Python中协程的应用机制: 使用纯Python来实现一个操作系统吧!!
- python orm框架sqlalchemy执行更新、删除时遇到的一个bug
- 最全Pycharm教程(9)——创建并运行一个基本的Python测试程序
- 简明Python教程的一个例子
- 用Python实现一个简单的多线程TCP服务器的教程
- 安卓小白如何制作一个精简ROOT的卡刷ROM?小白制作ROM包详细图文教程
- 使用Python编写一个在Linux下实现截图分享的脚本的教程
- 转载一个关于python web fraemwork 的理解
- Python GUI 教程 25行代码写一个小闹钟
- Python里的例子:一个基础验证相关的教程
- 用Python编写一个简单的Lisp解释器的教程
- python教程之二-----一个Python的非正式介绍