python:改良廖雪峰的使用元类自定义ORM

概要

本文仅仅是对廖雪峰老师的使用元类自定义ORM进行改进,并不是要创建一个ORM框架

编写field
class Field(object):def __init__(self, column_type,max_length,**kwargs):'''1,删除了参数name,field参数全部为定义字段类型相关参数,和众多有名的orm相同2,使用反射,方便字段的扩展,如本例使用deafault就是反射的应用'''self.column_type = column_type #字段类型self.max_length=max_length   #字段长度self.default=None  #字段默认值,如果想扩展可以填写更多的参数if kwargs:for k,v in kwargs.items():if hasattr(self,k):setattr(self,k,v)def __str__(self):return '<%s>' % (self.__class__.__name__)class StringField(Field):def __init__(self,max_length,**kwargs):super().__init__(column_type='varchar({})'.format(max_length),max_length=max_length,**kwargs)class IntegerField(Field):def __init__(self,**kwargs):super().__init__(column_type='bigint',max_length=8)
编写metaclass
class ModelMetaclass(type):def __new__(cls, name, bases, attrs):if name=='Model':return type.__new__(cls, name, bases, attrs)mappings = dict()for k, v in attrs.items():#print('k={},v={}'.format(k,v))if isinstance(v, Field):mappings[k] = vfor k in mappings.keys():attrs.pop(k)attrs['__mappings__'] = mappings # 保存属性和列的映射关系attrs['__table__'] = attrs.get('Meta').table or name # 假设表名和类名一致return type.__new__(cls, name, bases, attrs)
编写model
class Model(dict, metaclass=ModelMetaclass):def __init__(self, **kw):super(Model, self).__init__(**kw)def __getattr__(self, key):try:return self[key]except KeyError:raise AttributeError(r"'Model' object has no attribute '%s'" % key)def __setattr__(self, key, value):self[key] = valuedef save(self):fields = []params = []for k, v in self.__mappings__.items():fields.append(k)params.append(getattr(self, k,v.default))sql = 'insert into {} ({}) values ({})'.format(self.__table__, self.join(fields) ,self.join(params))print('SQL: %s' % sql)#自己写了一个join函数,廖雪峰老师使用自带join,无法处理数字等非字符串类型import functoolsdef join(self,attrs,pattern=','):return  functools.reduce(lambda x,y:'{}{}{}'.format(x,pattern,y),attrs)
测试
class User(Model):#使用Meta,能自定义表的相关信息class Meta:#自定义表名table='users'# 定义类的属性到列的映射:id = IntegerField()name = StringField(max_length=50)email = StringField(max_length=50,default='root@123.com')password = StringField(max_length=50)if __name__=="__main__":# 创建一个实例:u=User(id=234,name='jane',password='pwd')# 保存到数据库:u.save()#打印结果;SQL: insert into users (id,name,email,password) values (234,jane,root@123.com,pwd)
引用

1, 廖雪峰:使用元类

2, github:本文源码

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/391021.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

2019年度年中回顾总结_我的2019年回顾和我的2020年目标(包括数量和收入)

2019年度年中回顾总结In this post were going to take a look at how 2019 was for me (mostly professionally) and were also going to set some goals for 2020! &#x1f929; 在这篇文章中&#xff0c;我们将了解2019年对我来说(主要是职业)如何&#xff0c;我们还将为20…

在Java里重写equals和hashCode要注意什么问题

问题&#xff1a;在Java里重写equals和hashCode要注意什么问题 重写equals和hashCode有哪些问题或者陷阱需要注意&#xff1f; 回答一 理论&#xff08;对于语言律师或比较倾向于数学的人&#xff09;&#xff1a; equals() (javadoc) 必须定义为一个相等关系&#xff08;它…

vray阴天室内_阴天有话:第1部分

vray阴天室内When working with text data and NLP projects, word-frequency is often a useful feature to identify and look into. However, creating good visuals is often difficult because you don’t have a lot of options outside of bar charts. Lets face it; ba…

【codevs2497】 Acting Cute

这个题个人认为是我目前所做的最难的区间dp了&#xff0c;以前把环变成链的方法在这个题上并不能使用&#xff0c;因为那样可能存在重复计算 我第一遍想的时候就是直接把环变成链了&#xff0c;wa了5个点&#xff0c;然后仔细思考一下就发现了问题 比如这个样例 5 4 1 2 4 1 1 …

渐进式web应用程序_渐进式Web应用程序与加速的移动页面:有什么区别,哪种最适合您?

渐进式web应用程序Do you understand what PWAs and AMPs are, and which might be better for you? Lets have a look and find out.您了解什么是PWA和AMP&#xff0c;哪一种可能更适合您&#xff1f; 让我们看看并找出答案。 So many people own smartphones these days. T…

高光谱图像分类_高光谱图像分析-分类

高光谱图像分类初学者指南 (Beginner’s Guide) This article provides detailed implementation of different classification algorithms on Hyperspectral Images(HSI).本文提供了在高光谱图像(HSI)上不同分类算法的详细实现。 目录 (Table of Contents) Introduction to H…

在Java里如何给一个日期增加一天

在Java里如何给一个日期增加一天 我正在使用如下格式的日期: yyyy-mm-dd. 我怎么样可以给一个日期增加一天&#xff1f; 回答一 这样应该可以解决问题 String dt "2008-01-01"; // Start date SimpleDateFormat sdf new SimpleDateFormat("yyyy-MM-dd&q…

CentOS 7安装和部署Docker

版权声明&#xff1a;本文为博主原创文章&#xff0c;未经博主允许不得转载。 https://blog.csdn.net/u010046908/article/details/79553227 Docker 要求 CentOS 系统的内核版本高于 3.10 &#xff0c;查看本页面的前提条件来验证你的CentOS 版本是否支持 Docker 。通过 uname …

JavaScript字符串方法终极指南-拆分

The split() method separates an original string into an array of substrings, based on a separator string that you pass as input. The original string is not altered by split().split()方法根据您作为输入传递的separator字符串&#xff0c;将原始字符串分成子字符串…

机器人的动力学和动力学联系_通过机器学习了解幸福动力学(第2部分)

机器人的动力学和动力学联系Happiness is something we all aspire to, yet its key factors are still unclear.幸福是我们所有人都渴望的东西&#xff0c;但其关键因素仍不清楚。 Some would argue that wealth is the most important condition as it determines one’s li…

在Java里怎将字节数转换为我们可以读懂的格式?

问题&#xff1a;在Java里怎将字节数转换为我们可以读懂的格式&#xff1f; 在Java里怎将字节数转换为我们可以读懂的格式 像1024应该变成"1 Kb"&#xff0c;而1024*1024应该变成"1 Mb". 我很讨厌为每个项目都写一个工具方法。在Apache Commons有没有这…

ubuntu 16.04 安装mysql

2019独角兽企业重金招聘Python工程师标准>>> 1) 安装 sudo apt-get install mysql-server apt-get isntall mysql-client apt-get install libmysqlclient-dev 2) 验证 sudo netstat -tap | grep mysql 如果有 就代表已经安装成功。 3&#xff09;开启远程访问 1、 …

shell:多个文件按行合并

paste file1 file2 file3 > file4 file1内容为&#xff1a; 1 2 3 file2内容为&#xff1a; a b c file3内容为&#xff1a; read write add file4内容为&#xff1a; 1 a read 2 b write 3 c add 转载于:https://www.cnblogs.com/seaBiscuit0922/p/7728444.html

form子句语法错误_用示例语法解释SQL的子句

form子句语法错误HAVING gives the DBA or SQL-using programmer a way to filter the data aggregated by the GROUP BY clause so that the user gets a limited set of records to view.HAVING为DBA或使用SQL的程序员提供了一种过滤由GROUP BY子句聚合的数据的方法&#xff…

leetcode 1310. 子数组异或查询(位运算)

有一个正整数数组 arr&#xff0c;现给你一个对应的查询数组 queries&#xff0c;其中 queries[i] [Li, Ri]。 对于每个查询 i&#xff0c;请你计算从 Li 到 Ri 的 XOR 值&#xff08;即 arr[Li] xor arr[Li1] xor … xor arr[Ri]&#xff09;作为本次查询的结果。 并返回一…

大样品随机双盲测试_训练和测试样品生成

大样品随机双盲测试This post aims to explore a step-by-step approach to create a K-Nearest Neighbors Algorithm without the help of any third-party library. In practice, this Algorithm should be useful enough for us to classify our data whenever we have alre…

vue组件命名指南,不为取名而纠结

前言 自古中国取名文化博大进深,往往取一个好的名字而绞尽脑汁.那么一个好名字能够带来什么呢? 名字的内涵必需和使用者固有的本性相配套不和名人重名、不易重名、创意新颖&#xff0c;真正体现通过名字以区分人的作用响亮上口读起来流畅好听&#xff0c;协音美好&#xff0c;…

JavaScript 基础,登录验证

<script></script>的三种用法&#xff1a;放在<body>中放在<head>中放在外部JS文件中三种输出数据的方式&#xff1a;使用 document.write() 方法将内容写到 HTML 文档中。使用 window.alert() 弹出警告框。使用 innerHTML 写入到 HTML 元素。使用 &qu…

使用final类的作用是什么?

问题&#xff1a;使用final类的作用是什么&#xff1f; 我在看一本关于Java的书&#xff0c;它里面说你可以定义一个类为final。我搞不明白有什么地方会被用到这样。 我是一个编程萌新。我想知道程序员在他们的程序里面都是怎么用fianl类的。如果知道他们是什么时候使用的话&…

photoshop cc_如何使用Photoshop CC将图片变成卡通

photoshop ccA fun photo effect is to make a photo look like a cartoon. In this tutorial you will learn how to use Photoshop CC to make a photo look like a cartoon drawing.有趣的照片效果是使照片看起来像卡通漫画。 在本教程中&#xff0c;您将学习如何使用Photos…