手写orm
介绍
1 | 1 ORM即Object Relational Mapping,全称对象关系映射。 |
思路
1.先定义一个类
1 | 1.可以用类的属性来表示表名 |
1 | class Notic(): |
2.讲字段对应的属性写成类
1 | 4.回答第3个步骤的问题,把字段的对应的名字是id,字段的类型,主键是True,默认值是0定义到类里面,然后Notic对应的属性值进行调用就好了,发现字段的类型都不一样,所以我们要利用一个继承 |
1 | class Field(object): |
然后Notic对应的属性值进行调用就好了
1 | class Notic(): |
我们测试一下创建出来的类
加一个metaclass=ModelMetaclass
1 | class Notic(metaclass=ModelMetaclass): |
类属性attrs结果,id字段对应的对象IntegerField
1 | first_class={'__module__': '__main__', '__qualname__': 'Notic', |
3.思考一下这样好不好
一个id字段对应它的属性
4.所以我们把Notic它的属性放到一个字典里面,在生成它的时候进行new重置
1 | class ModelMetaclass(type): |
结果attrs把字段的属性放到字典mapping里面
1 | new__class={'__module__': '__main__', |
5.实例化的时候会生成对象,最好还是一个字典,所以用继承
比如
Notic(id=’22’,name=1233222,content=’11ddsad11’,user_id=9)
先继承Model
1 | class Notic(Model): |
再Model继承dict,控制Model和Notic类的创建
1 | class Model(dict, metaclass=ModelMetaclass): |
6.连接数据库
这个时候就要用到pymysql
写一个连接池fuckorm_pool.py,导入db_pool
1 | import pymysql |
db_pool.py导入setting.py
1 | import pymysql |
setting.py
1 | import os |
7.要实现Notic.select_one(id=1)查询id=1的字典怎么办?
还有查询所有select_all,利用绑定类的方法classmethod
update方法,save方法
1 | class Model(dict, metaclass=ModelMetaclass): |