Python实现一个ORM模型类
ORM是三个单词首字母组合而成,包含了Object(对象-类),Relations(关系),Mapping(映射)。解释过字面意思,但ORM的概念仍然模糊。私以为要理解一个事物,最好的法子是搞明白它出现是为了解决什么问题。
一个简单的ORM模型
我们也可以通过元类来实现自己的ORM。下面将涉及两个知识点:元类,描述符。
首先完成属性描述符的设计:
class BaseFiled(object):
pass class CharFiled(BaseFiled):
def __init__(self, max_len=10):
self.max_len = max_len def __get__(self, instance, owner):
return self.value def __set__(self, instance, value):
if isinstance(value, str):
# 判断类型进行控制
if len(value) <= self.max_len:
self.value = value
else:
raise TypeError('超出最大长度')
else:
raise TypeError('need a str') def __delete__(self, instance):
self.value = None class IntFiled(BaseFiled):
def __init__(self, max_len=10):
self.max_len = max_len def __get__(self, instance, owner):
return self.value def __set__(self, instance, value):
if isinstance(value, int):
# 判断类型进行控制
if len(str(value)) <= self.max_len:
self.value = value
else:
raise TypeError('超出最大长度')
else:
raise TypeError('need a int') def __delete__(self, instance):
self.value = None class BoolFiled(BaseFiled):
def __init__(self, max_len=10):
self.max_len = max_len def __get__(self, instance, owner):
return self.value def __set__(self, instance, value):
if isinstance(value, bool):
# 判断类型进行控制
self.value = value
else:
raise TypeError('need a bool')
实现一个元类:
class FieldMetaClass(type):
# 创建模型类的元类
def __new__(cls, name, bases, dic, *args, **kwargs):
if name == 'BaseModel':
return super().__new__(cls, name, bases, dic)
table_name = name.lower()
# 将类名转换成小写,对应数据表的名称
fields = {}
for k, v in dic.items():
# 判断value的类型是不是BaseFiled类型的 因为调用的类的父类就是BaseFiled 所以通过CharFiled等创建出来的对象也就是BaseFiled类型的
if isinstance(v, BaseFiled):
fields[k] = v
dic['t_name'] = table_name
dic['fields'] = fields
# 将类名和属性取出来放在一个字典中
return super().__new__(cls, name, bases, dic)
给模型类创建一个父类,具体原因及作用可以观察注释:
class BaseModel(metaclass=FieldMetaClass):
# 模型类的父类
def __init__(self, **kwargs):
# kwargs 传入的是一个字典
for k, v in kwargs.items():
setattr(self, k, v)
# setattr 设置属性 传入对象、属性名、属性值 def save(self):
# 保存一条数据,生成一条对应的sql语句
# 获取表名
t_name = self.t_name
# 获取字段名称
fields = self.fields
# 获取对应字段的值
filed_dict = {} # 创建一个字典用来存储键值对
for filed in fields.keys():
value = getattr(self, filed)
# 把遍历出来的键中的值找到
filed_dict[filed] = value # 生成对应的sql语句
sql = 'INSERT INTO {0} VALUES {1};'.format(t_name, tuple(filed_dict.values()))
生成模型类:
class User(BaseModel):
# 用户模型类 在模型类中不会重写init方法,在它的父类中写init方法 它会自动继承
username = CharFiled()
pwd = CharFiled()
age = IntFiled()
live = BoolFiled()
调用方式:
a = User(username='', pwd='', age=20, live=True)
a.save()
这样就实现了一个模型类,注释写的个人感觉还是比较清晰的,有不清楚的欢迎留言交流
Python实现一个ORM模型类的更多相关文章
- python django -2 ORM模型
ORM简介 MVC框架中包括一个重要的部分,就是ORM,它实现了数据模型与数据库的解耦,即数据模型的设计不需要依赖于特定的数据库,通过简单的配置就可以轻松更换数据库 ORM是“对象-关系-映射”的简称 ...
- ORM模型类介绍,
所有的软件开发过程中,都会涉及到对象和关系型数据库,在用户层面和业务逻辑层面,程序员编写代码都是面向对象的,当我们对象的信息发生变化的时候,都需要将对应的信息,传到关系型数据库中.而在此之前,需要我们 ...
- laravel框架总结(八) -- ORM模型
ORM模型简介 1>什么是ORM? ORM,即 Object-Relational Mapping(对象关系映射),它的作用是在关系型数据库和业务实体对象之间作一个映射,这样,我们在操作具体的 ...
- 利用Python实现一个感知机学习算法
本文主要参考英文教材Python Machine Learning第二章.pdf文档下载链接: https://pan.baidu.com/s/1nuS07Qp 密码: gcb9. 本文主要内容包括利 ...
- python 面向对象进阶之元类metaclass
一:知识储备 exec exec:三个参数 参数一:字符串形式的命令 参数二:全局作用域(字典形式),如果不指定,默认为globals() 参数三:局部作用域(字典形式),如果不指定,默认为local ...
- ORM模型简介
ORM模型简介 1>什么是ORM? ORM,即 Object-Relational Mapping(对象关系映射),它的作用是在关系型数据库和业务实体对象之间作一个映射,这样,我们在操作具体的 ...
- 【Flask】ORM模型创建及数据库映射
1. 用 declarative_base 根据 engine 创建一个ORM基类.2. 用 Base 类作为基类来写自己的ORM类.要定义 __tablename__ 类属性,来指定这个模型映射到数 ...
- laravel5.2总结--ORM模型
ORM模型简介 1>什么是ORM? ORM,即 Object-Relational Mapping(对象关系映射),它的作用是在关系型数据库和业务实体对象之间作一个映射,这样,我们在操作具体的 ...
- SQLAlchemy01 /SQLAlchemy去连接数据库、ORM介绍、将ORM模型映射到数据库中
SQLAlchemy01 /SQLAlchemy去连接数据库.ORM介绍.将ORM模型映射到数据库中 目录 SQLAlchemy01 /SQLAlchemy去连接数据库.ORM介绍.将ORM模型映射到 ...
随机推荐
- response读取图片+下载图片
读取图片 import java.io.FileInputStream; import java.io.IOException; import java.io.InputStream; import ...
- connect() failed (111: Connection refused) while connecting to upstream报错处理
新lnmp环境调试项目时,nginx报错如下: 解决: 发现php-fpm.conf是以套接字方式通信,而nginx是以端口方式通信,见下图: 将nginx.conf修改为如下,重新reload即可
- 招聘,api、app、web自动化,性能,持续集成,其他
招聘: api接口自动化测试 app功能自动化测试 web功能自动化测试 性能测试 自动化平台与持续集成 其他
- python 初学者
明确学习目标,不急于求成 当下是一个喧嚣.浮躁的时代.我们总是被生活中大量涌现的热点所吸引,几乎没有深度阅读和思考的时间和机会.我始终认为,学习是需要沉下心来慢慢钻研的,是长 期的:同时,学习不应该被 ...
- Spring Boot 2.x基础教程:使用 ECharts 绘制各种华丽的数据图表
上一节我们介绍了如何在Spring Boot中使用模板引擎Thymeleaf开发Web应用的基础.接下来,我们介绍一下后端开发经常会遇到的一个场景:可视化图表. 通常,这类需求在客户端应用中不太会用到 ...
- 前端每日实战:34# 视频演示如何用纯 CSS 创作在文本前后穿梭的边框
效果预览 按下右侧的"点击预览"按钮可以在当前页面预览,点击链接可以全屏预览. https://codepen.io/comehope/pen/qYepNv 可交互视频教程 此视频 ...
- python如何在图片上添加文字(中文和英文)
Python在图片上添加文字的两种方法:OpenCV和PIL 一.OpenCV方法 1.安装cv2 pip install opencv-python 2.利用putText方法来实现在图片的指定位置 ...
- volatile关键字的理解
volatile是java语言提供的一种稍弱的同步机制,它的作用是能够保证被volatile修饰的变量,每个线程在获取它的值时都能获取到最新的值. 要理解这个原理首先要知道java内存模型:每个线程都 ...
- ES6引入的Reflect对象目的何在?
Reflect对象其实就是为了取代Object对象.取代原因有一下几点: 1)Object对象的一些内部方法放在了Reflect上面,比如:Object.defineProperty.主要是优化了语言 ...
- xcode制作越狱包
1.将运行目标选为iOS Device 2.Edit Scheme -> 选择 Run [App Name] -> Build Configuration下拉框中选择Release 3.生 ...