orm

什么是orm?

对象关系映射:

    一个类映射成一张数据库的表

    类的对象映射成数据库中的一条条数据

    对象点数据映射成数据库某条记录的某个值

优点:不会写sql语句的程序员也可以很6的操作sql语句,大大的提升了开发效率

缺点:sql语句的效率不是很高

手撸orm具体代码

from orm_singleton.mysql_singleton import Mysql

# 表的字段通常需要有的属,字段类性字段名型,是否是主键,默认值
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 # 定义varchar字段类型
class StringField(Field):
def __init__(self, name, column_type='varchar(255)', 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) # 它是用来拦截跟数据库中表对应的类的创建
class MyMetaClass(type):
def __new__(cls, class_name, class_bases, class_attrs):
# 我们定义的元类是用来拦截模型表的创建过程,而models并不是一张模型表,所以不需要它的创建过程
if class_name == 'Models':
return type.__new__(cls,class_name,class_bases,class_attrs)
table_name = class_attrs.get('table_name',class_name)
primary_key = None
mappings = {}
# 下面的for循环需要做两件事
# 1.将单个单个的字段整合成一个
# 2.确定当前表当地哪个字段是主键
for k,v in class_attrs.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
# 循环mapping拿到所有的自定义字段名
for k in mappings.keys():
# 将单个单个的字段删除
class_attrs.pop(k)
# 校验用户自定义的模型表是否指定了主键字段
if not primary_key:
raise TypeError("一张表必须要有主键")
# 将标示表的特征信息 表名,表的主键字段,表的其他字段都塞到类的名称空间中
class_attrs['table_name'] = table_name
class_attrs['primary_key'] = primary_key
class_attrs['mappings'] = mappings
return type.__new__(cls, class_name, class_bases, class_attrs) class Models(dict, metaclass=MyMetaClass):
def __init__(self, **kwargs):
super().__init__(**kwargs) def __getattr__(self, item):
return self.get(item,'没有该键!') def __setattr__(self, key, value):
self[key] = value @classmethod
def select(cls,**kwargs): # id=1,name='jason',password='123'
ms = Mysql()
# select * from %s
if not kwargs:
sql = "select * from %s"%cls.table_name
res = ms.select(sql)
else:
# select * from %s where %s=%s
k = list(kwargs.keys())[0]
v = kwargs.get(k)
sql = "select * from %s where %s=?"%(cls.table_name,k) # select * from user where id=?
sql = sql.replace('?','%s') # select * from user where id=%s
res = ms.select(sql,v)
if res:
# res = [{},{},{}]
# cls(name='...',password='...')
return [cls(**r) for r in res] # [obj1,obj2,obj3] def update(self):
ms = Mysql()
# update user set name='jason',password='123' where id = 1
# update user set name=%s,password=%s where id = 1
# 定义一个列表存储该表的所有字段名
fields = []
# 定义一个变量用来存储当前数据对象的主键值
pr = None
values = []
for k,v in self.mappings.items():
# 先把当前数据对象对应的主键值拿到
if v.primary_key:
pr = getattr(self,v.name,v.default)
else:
# 除了主键之外的所有字段
fields.append(v.name+'=?') # [name=?,password=?...]
values.append(getattr(self,v.name,v.default)) sql = "update %s set %s where %s=%s"%(self.table_name,','.join(fields),self.primary_key,pr)
# update user set name=?,password=? where id=1
sql = sql.replace('?','%s')
# update user set name=%s,password=%s where id=1
ms.execute(sql,values) def save(self):
ms = Mysql()
# insert into user(name,password) values('zhaokang','123')
fields = []
# 专门用来存储与字段对应数量的?
args = []
values = []
for k,v in self.mappings.items(): # name:StringField(name='name')
if not v.primary_key: # 将id字段去除 因为id字段是自增,不需要人为的去操作
fields.append(v.name)
args.append('?')
values.append(getattr(self,v.name,v.default))
sql = "insert into %s(%s) values(%s)"%(self.table_name,','.join(fields),','.join(args))
# insert into user(name,password) values(?,?)
sql = sql.replace("?",'%s')
# insert into user(name,password) values(%s,%s)
ms.execute(sql,values)

 pool数据库连接池

from DBUtils.PooledDB import PooledDB
import pymysql POOL = PooledDB(
creator=pymysql, # 使用链接数据库的模块
maxconnections=6, # 连接池允许的最大连接数,0和None表示不限制连接数
mincached=2, # 初始化时,链接池中至少创建的空闲的链接,0表示不创建
maxcached=5, # 链接池中最多闲置的链接,0和None不限制
maxshared=3,
# 链接池中最多共享的链接数量,0和None表示全部共享。PS: 无用,因为pymysql和MySQLdb等模块的 threadsafety都为1,所有值无论设置为多少,_maxcached永远为0,所以永远是所有链接都共享。
blocking=True, # 连接池中如果没有可用连接后,是否阻塞等待。True,等待;False,不等待然后报错
maxusage=None, # 一个链接最多被重复使用的次数,None表示无限制
setsession=[], # 开始会话前执行的命令列表。如:["set datestyle to ...", "set time zone ..."]
ping=0,
# ping MySQL服务端,检查是否服务可用。# 如:0 = None = never, 1 = default = whenever it is requested, 2 = when a cursor is created, 4 = when a query is executed, 7 = always
host='127.0.0.1',
port=3306,
user='root',
password='admin',
database='youku',
charset='utf8',
autocommit='True'
)

 pymysql连接数据库

import pymysql
from orm_pool.pool import POOL class MySQL(object):
def __init__(self):
self.conn = POOL.connection()
self.cursor =self.conn.cursor(pymysql.cursors.DictCursor) # def colse_conn(self):
#
# self.conn.close()
# self.cursor.close() def select(self,sql,args=None):
self.cursor.execute(sql,args)
res = self.cursor.fetchall()
return res def execute(self,sql,args=None):
try:
self.cursor.execute(sql, args)
except BaseException as e:
print(e)

 测试orm

首先必须在自己的数据库建立一张表比如:

这张表我只是简单的举一个例子而已 你们也可以设计自己的表只需要在Filed中添加字段就行

if __name__ == '__main__':
class Teacher(Models):
table_name = 'teacher' #表的名字
tid = IntegerType(name='tid', primary_key=True) # IntegerType实例化出的对象
tname = StringType(name='tname') # StringType实例化出的对象 data_list = Teacher.select(tname='仓老师') #查
user_obj = data_list[0]
print(user_obj)
user_obj.tname = '波老师' # 改
user_obj.update()
user = Teacher(tname='小泽老师') #增
user.save()
print(user)

康少带你手撸orm的更多相关文章

  1. 手撸ORM浅谈ORM框架之Delete篇

    快速传送 手撸ORM浅谈ORM框架之基础篇 手撸ORM浅谈ORM框架之Add篇 手撸ORM浅谈ORM框架之Update篇 手撸ORM浅谈ORM框架之Delete篇 手撸ORM浅谈ORM框架之Query ...

  2. 手撸ORM浅谈ORM框架之基础篇

    好奇害死猫 一直觉得ORM框架好用.功能强大集众多优点于一身,当然ORM并非完美无缺,任何事物优缺点并存!我曾一度认为以为使用了ORM框架根本不需要关注Sql语句如何执行的,更不用关心优化的问题!!! ...

  3. 手撸ORM浅谈ORM框架之Add篇

    快速传送 手撸ORM浅谈ORM框架之基础篇 手撸ORM浅谈ORM框架之Add篇 手撸ORM浅谈ORM框架之Update篇 手撸ORM浅谈ORM框架之Delete篇 手撸ORM浅谈ORM框架之Query ...

  4. 手撸ORM浅谈ORM框架之Update篇

    快速传送 手撸ORM浅谈ORM框架之基础篇 手撸ORM浅谈ORM框架之Add篇 手撸ORM浅谈ORM框架之Update篇 手撸ORM浅谈ORM框架之Delete篇 手撸ORM浅谈ORM框架之Query ...

  5. 手撸ORM浅谈ORM框架之Query篇

    快速传送 手撸ORM浅谈ORM框架之基础篇 手撸ORM浅谈ORM框架之Add篇 手撸ORM浅谈ORM框架之Update篇 手撸ORM浅谈ORM框架之Delete篇 手撸ORM浅谈ORM框架之Query ...

  6. 手撸orm

    ORM简介 ORM即Object Relational Mapping,全称对象关系映射.当我们需要对数据库进行操作时,势必需要通过连接数据.调用sql语句.执行sql语句等操作,ORM将数据库中的表 ...

  7. 康少带你玩转JavaScript

    目录 1.JavaScript简述 2.JavaScript引入方式 3.JavaScript语法基础 4.JavaScript数据类型 5.运算符 6.流程控制 7.函数 8.内置对象和方法 1.J ...

  8. 【带你手撸Spring】没有哪个框架开发,能离开 Spring 的 FactoryBean!

    作者:小傅哥 博客:https://bugstack.cn 沉淀.分享.成长,让自己和他人都能有所收获! 一.前言 老司机,你的砖怎么搬的那么快? 是有劲?是技巧?是后门?总之,那个老司机的代码总是可 ...

  9. 康少带你python项目从部署到上线云服务器

    首先,服务器要安装nginx和mysql,网站文件建议放在/usr/local/www,环境python3.6+mysql5.7,阿里云的服务器可以用公共镜像有一个配置好的,不然就自己装一下环境吧. ...

随机推荐

  1. c/c++标准库中的文件操作总结

    1 stdio.h是c标准库中的标准输入输出库 2 在c++中调用的方法 直接调用即可,但是最好在函数名前面加上::,以示区分类的内部函数和c标准库函数. 3 c标准输入输出库的使用 3.1 核心结构 ...

  2. Tomcat启动过程中卡住了

    我在部署完项目后,debug启动Tomcat会在中间卡住不继续执行,测试发现在不部署项目的时候Tomcat是可以正常启动的. 控制台信息如下: 十月 25, 2017 10:40:44 上午 org. ...

  3. 虚拟机linux安装mysql

    安装mysql时需要的全套安装包 mysql-5.1.73-3.el6_5.i686.rpm mysql-libs-5.1.73-3.el6_5.i686.rpm mysql-server-5.1.7 ...

  4. 官方文档Core Technologies - Part 1

    首先介绍系列文章内容及Spring Framework官方文档情况. 在这一系列学习中,我阅读的主要资源是5.1.2 Reference Doc.,以及论坛大神的讲解blog.另外,Spring官方也 ...

  5. CentOS(Linux) - 安装软件笔记(一) - VPSMate(服务器可视化管理工具)安装

    更多详情点击参考官网说明 vpsmate官方推荐centos版本为6.2 64位 使用 SSH 连接工具,如 PuTTY.XShell.SecureCRT 等,连接到您的 Linux 服务器. 执行以 ...

  6. Looksery Cup 2015 C. The Game Of Parity —— 博弈

    题目链接:http://codeforces.com/problemset/problem/549/C C. The Game Of Parity time limit per test 1 seco ...

  7. 更改Windows的“视频”“图片”“”下载“文档”“音乐”“桌面”的默认路径

    右键-->属性

  8. DDD领域驱动之干货(二)

       基于仓储的实现 1.前言:本着第一节写的有些糊涂,主要是自己喜欢实干,不太喜欢用文字表述,就这样吧.下面切入正题. 博客园里面有很多的大佬,我这里就不一一解释概览,有兴趣的朋友可以去看大佬们写的 ...

  9. Fast RCNN中RoI的映射关系

    写在前面:下面讨论中Kernel Size为奇数,因为这样才能方便一致的确认Kernel中心. 在Fast RCNN中,为了大大减少计算量,没有进行2k次运算前向运算,而是进行了1次运算,然后在从po ...

  10. BZOJ_4154_[Ipsc2015]Generating Synergy_KDTree

    BZOJ_4154_[Ipsc2015]Generating Synergy_KDTree Description 给定一棵以1为根的有根树,初始所有节点颜色为1,每次将距离节点a不超过l的a的子节点 ...