youku项目总结(粗略总结)
一、ORM
之前我们都是以文件保存的形式存储数据,这次我们用的是数据库结合python使用,用到
ORM:关系型映射
类》》数据库的一张表
对象》》表一条记录
对象.属性》》记录某一个字段对应的值
关于ORM我们其实可以调用别人已经写好的,这次我们是自己写ORM。
这个就是在Django中调用别人的写好的

字段四要素:
- 字段名
- 字段类型
- 主键
- 默认值
1.先设计字段类型(这次只会用到两个字段类型,所以只设计两个)
#定义字段类型 name,column_type,primary_key,default (字段名,字段类型,主键,默认值)
class Field(object):
def __init__(self,name,column_type,primary_key,default):
self.name = name
self.column_type = column_type
self.primary_key = primary_key
self.default = default #下面这些类型也可以不定义,但是你每次调用Field的时候,每个参数值都需要写
#定义varchar字段类型(针对于字段类型是varchar的)
class StringField(Field):
def __init__(self,name,column_type = 'varchar(32)',primary_key = False,default = None):
super().__init__(name,column_type,primary_key,default) #定义int字段类型
class IntegerField(Field):
def __init__(self,name,column_type = 'int',primary_key =False ,default = 0):
super().__init__(name,column_type,primary_key,default)
2.设计模型表
继承字典类型,可以接收任意个数的关键字参数
所有模型表都继承Models,Models继承dict,__getattr__是当通过对象.属性的方式取值,属性不存在的话,就会触发这个方法
__setattr__是当新增或者修改属性的时候就会触发这个方法
class Models(dict,metaclass = Mymetaclass)
def __init__(self,**kwargs): #接收任意多个关键字参数
super().__init__(**kwargs) #继承dict def __getattr__(self, item): #item是不存在的属性名 self是一个字典对象
return self.get(item) def __setattr__(self, key, value): #新增或者修改属性都会走这个
self[key] = value
表三要素:
- 表名
- 字段们
- 主键
3.使用元类,拦截自定义模型表的创建过程
使用元类,在类创建的时候把表名、字段、主键塞给类
类在创建的三个步骤:
1.__new__产生一个空对象
2.__init__实例化
3.将产生的对象返回
class MyMetaclass(type): #需要设置表名,主键,字段
def __new__(cls,class_name,class_bases,class_attr): #__new__创建一个空对象,class_name(类名),class_bases(基类们),class_attr(名称空间)
#自定义元类是拦截模型表的创建过程,而models并不是一张模型表,所以不需要它的创建过程
if class_name == 'Models':
return type.__new__(cls,class_name,class_bases,class_attr) #如果是models直接返回type
table_name = class_attr.get('table_name',class_name) #获取名称空间内的表名,没有就返回类名
primary_key = None
mappings = {} #方便后面取值
for k,v in class_attr.items(): #循环获取名称空间的所有键值对 k:id,name v:IntegerField(),StringField()是对象
if isinstance(v,Field): #拿出所有自定义的字段属性
#将所有自定义表的字段全部存入字典中
mappings[k] = v
if v.primary_key: #判断字段是否存在主键
if primary_key:
raise TypeError('一张表只能存在一个主键')
primary_key = v.name #设置主键字段名
#循环取出mappings的key(也就是自定义的字段名),因为后面要把自定义的mappings放进class_attr里面,为了节省空间所以把原来的键值对删除
for k in mappings.keys():
class_attr.pop(k) #将名称空间内的重复k,v键值对删除
#校验自定义的的表是否指定了主键字段
if not primary_key:
raise TypeError('一张表必须要有一个主键') class_attr['table_name'] = table_name
class_attr['primary_key'] = primary_key
class_attr['mappings'] = mappings return type.__new__(cls,class_name,class_bases,class_attr)
4.结合pymsql模块,封装查询和提交语句
import pymysql
from orm.db_pool import POOL
class Mysql:
def __init__(self):
self.conn =POOL.connection()
self.cursor = self.conn.cursor(pymysql.cursors.DictCursor) #创建游标 def close_db(self):
self.cursor.close()
self.conn.close() #查询
def select(self,sql,args = None):
self.cursor.execute(sql,args)
res = self.cursor.fetchall() #查询所有 [{},{},{}....]
return res #封装提交
def myexecute(self,sql,args):
try:
self.cursor.execute(sql,args)
except Exception as e:
print(e)
二、项目书写
项目是由服务端和客户端组成,基于socket通信

未完
youku项目总结(粗略总结)的更多相关文章
- sprint2 项目的粗略展示
- Java 最常用类(前1000名) 来自GitHub 3000个项目
这篇文章主要介绍了最常用的1000个Java类(附代码示例),需要的朋友可以参考下 分析Github 3000个开源项目,粗略统计如下.括号内的数字是使用频率 0-3000. 下面的列表显示不全,完整 ...
- you-get中文说明
来源于:https://github.com/soimort/you-get/wiki/%E4%B8%AD%E6%96%87%E8%AF%B4%E6%98%8E You-Get 乃一小小哒命令行程序, ...
- PM过程管理成熟度1级
之前,我已经从项目实现的角度.企业管理诉求两方面,分析了PM的核心能力架构,以及其在过程管理方面的能力等级.接下来,Fancier凡奉信息会站在PM能力成长的角度,横向与纵向阐述每一成熟度等级PM的过 ...
- 一点感悟:《Node.js学习笔记》star数突破1000+
写作背景 笔者前年开始撰写的<Node.js学习笔记> github star 数突破了1000,算是个里程碑吧. 从第一次提交(2016.11.03)到现在,1年半过去了.突然有些感慨, ...
- you-get
1.打开cmd,输入命令并执行 pip3 install you-get 2.输入命令,检测 You-Get 是否安装成功 you-get 3.开始下载吧 you-get [视频地址]you-get ...
- 【转】合理的布局,绚丽的样式,谈谈Winform程序的界面设计
从事Winform开发很多年了,由于项目的需要,设计过各种各样的界面效果.一般来说,运用传统的界面控件元素,合理设计布局,能够设计出比较中规中矩的标准界面:利用一些换肤的控件或者部分界面组件,能够设计 ...
- apache + tomcat 负载均衡分布式集群配置
Tomcat集群配置学习篇-----分布式应用 现目前基于javaWeb开发的应用系统已经比比皆是,尤其是电子商务网站,要想网站发展壮大,那么必然就得能够承受住庞大的网站访问量:大家知道如果服务器访问 ...
- 合理的布局,绚丽的样式,谈谈Winform程序的界面设计
转载,不错的学习文章 阅读后,起初不太明白,试验了几次后明白了dev的强大.从事Winform开发很多年了,由于项目的需要,设计过各种各样的界面效果.一般来说,运用传统的界面控件元素,合理设计布局,能 ...
随机推荐
- JavaScript data types and data structures
JavaScript data types and data structures Programming languages all have built-in data structures, b ...
- Qualcomm Audio HAL 音频通路设置【转】
本文转载自:https://blog.csdn.net/azloong/article/details/79383323 1. 音频框图概述| Front End PCMs | SoC DSP | B ...
- Qt Resource System Qt资源体系(qrc rcc)
Qt资源体系采用平台独立机制来存储应用程序执行时的二进制文件.这种机制在应用程序需要一些确定的文件(图标.翻译文件等等)而且又不想冒丢失文件的风险时是有用的. 资源体系依赖于 qmake, rcc ( ...
- OptaPlanner - AI Constraint satisfaction solver
OptaPlanner - 国内版 Binghttps://cn.bing.com/search?q=OptaPlanner&qs=n&form=QBRE&sp=-1& ...
- php 判断图片文件的真实类型
/** * * 检测文件的真实类型 * * @param string $srcPath 文件路径 * * @return string $realType 文件真实类型 * */ $imgurl = ...
- 无法调用到appcode下的类
解决方法: 右键 appp_code下的类, 点击 “属性”, 里面 [生成操作] 一项 由内容 改为 编译 即可
- Dart抽象类和多态
/* Dart中抽象类: Dart抽象类主要用于定义标准,子类可以继承抽象类,也可以实现抽象类接口. 1.抽象类通过abstract 关键字来定义 2.Dart中的抽象方法不能用abstract声明, ...
- java-mybaits-016-mybatis知识点StatementType
1.statementType 在mapper文件中可以使用statementType标记使用什么的对象操作SQL语句. statementType:标记操作SQL的对象 要实现动态传入表名.列名,需 ...
- 获取Excel中的图片
如下图,上传要获取这里面的图片,而又不能直接选择,怎么办呢? 1.首先复制一份Excel文件命名copy.xlsx 2.修改copy.xlsx文件的后缀名变成copy.rar 3.解压copy.rar ...
- pcm、wav、amr说明
wav比pcm多44个字节(在文件头位置多)