mysql连接类与ORM的封装
ORM:
- ORM什么是?
类名 ---> 数据库表
对象 ---> 记录
对象.属性 ---> 字段
- ORM的优缺点:
优点:
可跨平台,可以通过对象.属性取值,对象.方法,让该方法内部执行SQL语句。比如:save --> insert into table...
缺点:
1.执行效率低
2.程序员随着年龄的增长,会遗忘原生SQL语句。
MySQL连接类:
import pymysql
class MySQLClient():
def __init__(self):
# 1.连接数据库客户端
self.client = pymysql.connect(
host
port
user
password
database
charset='utf8'
autocommit=True
)
# 2.获取数据库游标
self.cursor = self.client.cursor(
pymysql.cursors.DictCursor
)
# 查询方法
def my_select(self, sql, value=None):
# 1.提交sql语句
self.cursor.execute(sql, value)
# 2.获取数据库查询返回的结果
res = self.cursor.fetchall()
return res
# 插入或更新方法sql提交
def my_execute(self, sql, value):
try:
# 提交sql语句
self.cursor.execute(sql, value)
except Exception as e:
print(e)
def close(self):
# 关闭游标
self.cursor.close()
# 关闭数据库连接
self.client.close()
ORM封装的查、增、改
from mysql_py import MySQLClient
查
@classmethod User.orm_select(name=tank)
def orm_select(cls, **kwargs): # name=tank, age=18 ---> {name:tank, }
mysql = MySQLClient()
# 如果没有查询条件
if not kwargs:
# sql: select * from table_name;
sql = 'select * from %s' % cls.table_name
res = mysql.my_select(sql)
# 如果有查询条件
else:
key = list(kwargs.keys())[0]
value = kwargs.get(key)
sql = 'select * from %s where %s=?' % (cls.table_name, key)
sql = sql.replace('?', '%s')
res = mysql.my_select(sql, value)
# res ---> [{}, {}, {}] ------> [obj, obj. obj]
# 将普通字典对象转为特殊字典对象---> 给普通字典对象添加了 对象.属性 取值/存值得方式。
return [cls(**r) for r in res] # **{k:v, k2: v2} ---> k=v, k2=v2
增: insert into
def orm_insert(self):
mysql = MySQLClient()
# sql: insert into table_name(f1, f2..) values(v1, v2..);
key_list = []
value_list = []
args_list = []
for k, v in self.mappings.items():
# k--》字段名
# v--》字段对象
if not v.primary_key:
# 获取字段名
key_list.append(v.name)
# key_list.append(k)
# 获取字段值
value_list.append(
# 通过反射获取字段的值: 反射可以通过字符串获取对象的属性值
getattr(self, v.name, v.default) # 若v.name没有值,则使用默认值
)
args_list.append('?')
# 'insert into %s(%s) values(???)'
sql = 'insert into %s(%s) values(%s)' % (
self.table_name, ','.join(key_list),
','.join(args_list)
)
sql = sql.replace('?', '%s')
mysql.my_execute(sql, value_list)
改: update table_name set k=v, k2=v2 where id=pk_val;
def orm_update(self):
mysql = MySQLClient()
key_list = []
value_list = []
primary_key = None
for k, v in self.mappings.items():
# 1.获取主键与主键对应的值
if v.primary_key:
primary_key = v.name + '=%s' % getattr(self, v.name)
else:
key_list.append(
v.name + '=?'
)
value_list.append(
getattr(self, v.name)
)
sql = 'update %s set %s where %s' % (
self.table_name,
','.join(key_list),
primary_key
)
sql = sql.replace('?', '%s')
mysql.my_execute(sql, value_list)
mysql连接类与ORM的封装的更多相关文章
- 深入理解php的MySQL连接类
php的MySQL连接类. 后面几个show_databases和show_tables....等方法都用了一堆echo,好像一直不喜欢在类的方法里直接用输出语句,不过这也只是列举数据库和表名,构造 ...
- php--->单例模式封装mysql操作类
php 单例模式封装mysql操作类 单例模式的必要条件(三私一公) 私有的成员属性--防止类外引入这个存放对象的属性 私有的构造方法--为了防止在类外使用new关键字实例化对象 私有的克隆方法--为 ...
- mysql连接池的使用工具类代码示例
mysql连接池代码工具示例(scala): import java.sql.{Connection,PreparedStatement,ResultSet} import org.apache.co ...
- orm映射 封装baseDao
是用orm映射封装自己封装dao层 思路:通过映射获得实体类的属性拼接sql语句 import java.lang.reflect.Field; import java.lang.reflect.In ...
- MySql连接异常解决
这两天遇到一个mysql连接的问题,找人弄了好几天也没弄好,先看一下报错信息: ============================================================ ...
- mysql连接的一些问题。
最近网站出现 User 数据库名称 has already more than 'max_user_connections' active connections 的报错,网站瘫痪.有必要研究下这个问 ...
- python学习之 -mysql 连接和db_config配置
最近学习python,记录下自己写学习python的代码和心得,自己写了一个使用python mysql 的查询语句和做的一个db_config.py 配置信息. 1.db_config.py 配置文 ...
- MySQL连接问题【如何解决MySQL连接超时关闭】
--MySQL连接问题[如何解决MySQL连接超时关闭] ------------------------------------------------转载 最近做网站有一个站要用到WEB网页采集器 ...
- Asp.Net SignalR - 持久连接类
持久连接类 通过SignalR持久连接类可以快速的构建一个即时通讯的应用,上篇博文已经我们创建一个owin Startup类和一个持久连接类来完成我们的工作,然后在Startup类的Configura ...
随机推荐
- Python爬虫学习==>第八章:Requests库详解
学习目的: request库比urllib库使用更加简洁,且更方便. 正式步骤 Step1:什么是requests requests是用Python语言编写,基于urllib,采用Apache2 Li ...
- script学习,如何用linux监控你的同事?
环境:CentOS7 一.为什么要学习script命令 当你在终端或控制台上工作时,你想记录下自己做了些什么吗?当你跟一些Linux管理员同时在系统上干活,你想知道别人干了什么吗?当你让别人远程到你的 ...
- 【POJ - 3126】Prime Path(bfs)
Prime Path 原文是English 这里直接上中文了 Descriptions: 给你两个四位的素数a,b.a可以改变某一位上的数字变成c,但只有当c也是四位的素数时才能进行这种改变.请你计算 ...
- 【AMADM】django-braces -- Django的一些可重用的,通用型的mixin
动机 简介 个人评分 动机 Django1.8以后加入了Class Based View,以及GenericView概念.之后在django对类的使用更加频繁. 而一些特性,相信我们都有重复地编写过. ...
- 【Python开发】Python中的class继承
继承是面向对象的重要特征之一,继承是两个类或者多个类之间的父子关系,子进程继承了父进程的所有公有实例变量和方法.继承实现了代码的重用.重用已经存在的数据和行为,减少代码的重新编写,python在类名后 ...
- vscode配置PHP Debug
1.先在vscode中安装PHP Debug,在设置添加“php.validate.executablePath”项,选中对应版本的php.exe. "php.validate.execut ...
- Sink - 汇聚点
!!!1.Logger Sink 记录INFO级别的日志,通常用于调试. 属性说明: !channel – !type – The component type name, needs to ...
- 树莓派3 安装kali注意事项(无需显示器、键鼠连接树莓派)2017/9/18更新
kali系统树莓派专用版下载地址https://www.offensive-security.com/kali-linux-arm-images/ 官方下载页面https://www.kali.or ...
- 2019牛客暑期多校训练营(第一场)-A (单调栈)
题目链接:https://ac.nowcoder.com/acm/contest/881/A 题意:给定两个长度均为n的数组a和b,求最大的p使得(a1,ap)和(b1,bp)等价,等价的定义为其任意 ...
- 解决 mysql (10038)
1.授权 mysql>grant all privileges on *.* to 'root'@'%' identified by 'youpassword' with grant o ...