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模型映射到 ...
随机推荐
- 【XP系统下载U盘装系统】用电脑店超级U盘装XP系统详细图文教程
现在U盘装系统已经越来越流行了,不仅方便而且简单,由于U盘启动盘用的制作工具不同,其中比较流行的有老毛桃.电脑店.大白菜.一键U盘装系统等等,因此安装过程中也有不尽相同的,今天就和大家分享下利用电脑店 ...
- springboot oauth 鉴权之——password鉴权相当于jwt鉴权模式
近期一直在研究鉴权方面的各种案例,这几天有空,写一波总结及经验. 第一步:什么是 OAuth鉴权 OAuth2是工业标准的授权协议.OAuth2取代了在2006创建的原始OAuthTM协议所做的工作. ...
- Win10+GTX906M+Tensorflow-gpu==2.1.0
环境 Windows10 GeForce GTX 960M python 3.7.6 tensorflow-gpu==2.1.0 CUDA 10.2 cuDNN v7.9.4.38 for windo ...
- 剑指offer-18-2. 删除链表中重复的结点
剑指offer-18-2. 删除链表中重复的结点 链表 在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针. 例如,链表1->2->3-> ...
- PHP 全局使用 Laravel 辅助函数 dd
dump() 方法 全局 composer.json 12345 "require": { "squizlabs/php_codesniffer": " ...
- Zookeeper:fsync超时导致实例异常
一.问题描述 2019-02-19 08:44左右,实时计算服务重启,报错显示找不到zk集群的leader节点,同时ZooKeeper集群有告警显示连接超时: 指标[连接耗时(ms)=18221]符合 ...
- memcached单点登录配置
域名 www.lxy.comblog.lxy.comnews.lxy.comshop.lxy.com php配置 session.save_handler = memcache session写mem ...
- 深度视觉盛宴——CVPR 2016
小编按: 计算机视觉和模式识别领域顶级会议CVPR 2016于六月末在拉斯维加斯举行.微软亚洲研究院在此次大会上共有多达15篇论文入选,这背后也少不了微软亚洲研究院的实习生的贡献.大会结束之后,小编第 ...
- python爬虫-提取网页数据的三种武器
常用的提取网页数据的工具有三种xpath.css选择器.正则表达式 1.xpath 1.1在python中使用xpath必须要下载lxml模块: lxml官方文档 :https://lxml.de/i ...
- python 保存两位小数
一.代码 import decimal decimal.getcontext().rounding = decimal.ROUND_HALF_UP def index(number): n = str ...