ORM全称“Object Relational Mapping”,即对象-关系映射,就是把关系数据库的一行映射为一个对象,也就是一个类对应一个表,这样,写代码更简单,不用直接操作SQL语句。
一、预备知识
开始之前,请先掌握python metaclass的知识,请参考我的文章:从Python Metaclass说起
为什么要使用metaclass?因为要编写一个ORM框架,所有的类都只能动态定义,只有使用者才能根据表的结构定义出对应的类来。
掌握了元类的知识后,我们来尝试编写一个ORM框架。首先,假设我们有一个User表,那么我们可能会写出如下代码:
怎么样?我们可以不用直接去操作SQL了,看上去是不是非常简单呢?
二、设计Field类
接下来我们要定义Field类,它负责保存数据库表的字段名和字段类型:
|
|
三、设计Model类
Model类是数据库表类的基类。
在Model类中,就可以定义各种操作数据库的方法,比如save(),delete(),find(),update等等:
|
|
四、设计ModelMetaclass元类
最后就是mnetaclass元类的编写了。
使用Model中定义的metaclass的ModelMetaclass来创建User类,也就是说,metaclass可以隐式地继承到子类:
|
|
至此,核心代码基本上写完了,怎么样?看起来也不是很难。我们来梳理一下:
- 定义一个class User(Model)类
- Python解释器通过父类Model的metaclass找到ModelMetaclass类,通过它来创建User
- ModelMetaclass保存User类的一些信息,比如表名,字段等
- 当我们调用save()方法时,会去用到第三步骤保存的信息,构造出SQL语句,将数据保存到数据库中
我们编写代码:
输出:
可以看到,save()方法打印出了SQL语句和参数列表,我们可以根据自己的需求,来将此信息存储到数据库中。
References: