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开发很多年了,由于项目的需要,设计过各种各样的界面效果.一般来说,运用传统的界面控件元素,合理设计布局,能 ...
随机推荐
- 如何在wcf中用net tcp协议进行通讯
快速阅读 如何在wcf中用net tcp协议进行通讯,一个打开Wcf的公共类.比较好好,可以记下来. 配置文件中注意配置 Service,binding,behaviors. Service中配置en ...
- pyinstaller在64位系统下打包32位程序
使用环境说明:win10 64位,已安装python3.6-64位版本 遇到的问题:win10 64位打包成exe文件后,不能在32位系统运行 需求:使用python打包生成exe文件,win64位和 ...
- 深度学习面试题25:分离卷积(separable卷积)
目录 举例 单个张量与多个卷积核的分离卷积 参考资料 举例 分离卷积就是先在深度上分别卷积,然后再进行卷积,对应代码为: import tensorflow as tf # [batch, in_he ...
- python命令行传入参数
1.sys import sys a=eval(sys.argv[1])b=eval(sys.argv[2]) print(a+b) 1 2 3 4 5 6 evel() ...
- 小程序运行报错navigateTo:fail page "pages/warn/warn" is not found
在index.js中配置触发时页面转发 wx.navigateTo({ url: '../warn/warn', }) 实际上触发时报错页面找不到 原因是页面路径没有在app.json里面没有定义过, ...
- pip错误 ImportError: No module named 'pip_internal'
ubuntu16.04 - wget https://bootstrap.pypa.io/get-pip.py --no-check-certificate sudo python get-pip.p ...
- http://man7.org/linux/man-pages/man2/epoll_wait.2.html
https://segmentfault.com/a/1190000007240744 https://baike.baidu.com/item/Glibc http://man7.org/linux ...
- Nexus3.X忘记admin密码找回
一.问题背景 nexus3 这种东西,传完一次,很少动了,很容易忘记密码,不要急有方法找回. 官方网站关于解决该问题的方法: https://support.sonatype.com/hc/en-us ...
- mysql - ERROR 1114 (HY000): The table is full
mysql - ERROR 1114 (HY000): The table is full - Stack Overflowhttps://stackoverflow.com/questions/73 ...
- PHP 循环输出多重数组元素
<?php $arr = array( array( array( array( array( ,, ) ) ), array( ,,) ) ), array(, , ) ); function ...