一、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项目总结(粗略总结)的更多相关文章

  1. sprint2 项目的粗略展示

  2. Java 最常用类(前1000名) 来自GitHub 3000个项目

    这篇文章主要介绍了最常用的1000个Java类(附代码示例),需要的朋友可以参考下 分析Github 3000个开源项目,粗略统计如下.括号内的数字是使用频率 0-3000. 下面的列表显示不全,完整 ...

  3. you-get中文说明

    来源于:https://github.com/soimort/you-get/wiki/%E4%B8%AD%E6%96%87%E8%AF%B4%E6%98%8E You-Get 乃一小小哒命令行程序, ...

  4. PM过程管理成熟度1级

    之前,我已经从项目实现的角度.企业管理诉求两方面,分析了PM的核心能力架构,以及其在过程管理方面的能力等级.接下来,Fancier凡奉信息会站在PM能力成长的角度,横向与纵向阐述每一成熟度等级PM的过 ...

  5. 一点感悟:《Node.js学习笔记》star数突破1000+

    写作背景 笔者前年开始撰写的<Node.js学习笔记> github star 数突破了1000,算是个里程碑吧. 从第一次提交(2016.11.03)到现在,1年半过去了.突然有些感慨, ...

  6. you-get

    1.打开cmd,输入命令并执行 pip3 install you-get 2.输入命令,检测 You-Get 是否安装成功 you-get 3.开始下载吧 you-get [视频地址]you-get ...

  7. 【转】合理的布局,绚丽的样式,谈谈Winform程序的界面设计

    从事Winform开发很多年了,由于项目的需要,设计过各种各样的界面效果.一般来说,运用传统的界面控件元素,合理设计布局,能够设计出比较中规中矩的标准界面:利用一些换肤的控件或者部分界面组件,能够设计 ...

  8. apache + tomcat 负载均衡分布式集群配置

    Tomcat集群配置学习篇-----分布式应用 现目前基于javaWeb开发的应用系统已经比比皆是,尤其是电子商务网站,要想网站发展壮大,那么必然就得能够承受住庞大的网站访问量:大家知道如果服务器访问 ...

  9. 合理的布局,绚丽的样式,谈谈Winform程序的界面设计

    转载,不错的学习文章 阅读后,起初不太明白,试验了几次后明白了dev的强大.从事Winform开发很多年了,由于项目的需要,设计过各种各样的界面效果.一般来说,运用传统的界面控件元素,合理设计布局,能 ...

随机推荐

  1. tail -f 加过滤功能

    实时查看日志 通过-f参数,我们可以实时查看文件的新增内容: $ tail -f itbilu.log 注意:使用-f参数时不会中断文件监视,需要通过ctrl+c手动结束. 实时日志查看与grep过滤 ...

  2. 表观 | Enhancer | ChIP-seq | 转录因子 | 数据库专题

    需要长期更新! 参考:生信修炼手册 enhancer的基本概念: 长度几十到几千bp,作用是提高靶基因活性,属于顺式作用原件,DNA作用到DNA,转录因子就是反式,是结合到DNA的蛋白. 1981年, ...

  3. SonarQube入门【转】

    一.SonarQube简介Sonar 是一个用于代码质量管理的开放平台.通过插件机制,Sonar可以集成不同的测试工具,代码分析工具, 以及持续集成工具. 比如pmd-cpd.checkstyle.f ...

  4. TP5 分页数据加锚点

      TP5 分页数据加锚点跳转到相应位置   有这样一个需求,就是加载评论后,点下一页的时候回到相应的位置.  $comment = Db('comment')->order('addtime' ...

  5. MySQL按日期分组并统计截止当前时间的总数(实例教程)

    MySQL按日期分组并统计截止当前时间的总数 建表语句 SET NAMES utf8mb4; ; -- ---------------------------- -- Table structure ...

  6. Windows上安装nodejs版本管理器nvm 安装成功之后重启终端失效

    nvm 安装成功之后重启终端失效(command not found) 安装nvm之后node不可用,“node”不是内部或外部命令,也不是可运行的程序或批处理文件(ng) 安装nvm: 下载nvm压 ...

  7. Dart运算符条件判断类型转换

    /* 1.Dart运算符: 算术运算符 + - * / ~/ (取整) %(取余) 关系运算符 == != > < >= <= 逻辑运算符 ! && || 赋值 ...

  8. python接入微博第三方API之1环境准备

    环境准备: 1.注册微博账号 2.注册应用

  9. Python3基础 def 函数要先定义再调用

             Python : 3.7.3          OS : Ubuntu 18.04.2 LTS         IDE : pycharm-community-2019.1.3    ...

  10. Android平台签名证书(.keystore)生成指南

    来源:https://ask.dcloud.net.cn/article/35777 Android平台签名证书(.keystore)生成指南 分类:HTML5+ Android证书 Android平 ...