orm-1
ORM什么是?
类名 ---> 数据库表
对象 ---> 记录
对象.属性 ---> 字段- ORM的优缺点:
优点:
可跨平台,可以通过对象.属性取值,对象.方法,让该方法内部执行SQL语句。比如:save --> insert into table... 缺点:
1.执行效率低
2.程序员随着年龄的增长,会遗忘原生SQL语句。
2、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()
3、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)
orm-1的更多相关文章
- 终于等到你:CYQ.Data V5系列 (ORM数据层)最新版本开源了
前言: 不要问我框架为什么从收费授权转到免费开源,人生没有那么多为什么,这些年我开源的东西并不少,虽然这个是最核心的,看淡了就也没什么了. 群里的网友:太平说: 记得一年前你开源另一个项目的时候我就说 ...
- Enterprise Solution 3.1 企业应用开发框架 .NET ERP/CRM/MIS 开发框架,C/S架构,SQL Server + ORM(LLBL Gen Pro) + Infragistics WinForms
行业:基于数据库的制造行业管理软件,包含ERP.MRP.CRM.MIS.MES等企业管理软件 数据库平台:SQL Server 2005或以上 系统架构:C/S 开发技术 序号 领域 技术 1 数据库 ...
- UWP开发之ORM实践:如何使用Entity Framework Core做SQLite数据持久层?
选择SQLite的理由 在做UWP开发的时候我们首选的本地数据库一般都是Sqlite,我以前也不知道为啥?后来仔细研究了一下也是有原因的: 1,微软做的UWP应用大部分也是用Sqlite.或者说是微软 ...
- 搭建一套自己实用的.net架构(3)续 【ORM Dapper+DapperExtensions+Lambda】
前言 继之前发的帖子[ORM-Dapper+DapperExtensions],对Dapper的扩展代码也进行了改进,同时加入Dapper 对Lambda表达式的支持. 由于之前缺乏对Lambda的知 ...
- CYQ.Data 从入门到放弃ORM系列:开篇:自动化框架编程思维
前言: 随着CYQ.Data 开始回归免费使用之后,发现用户的情绪越来越激动,为了保持这持续的激动性,让我有了开源的念头. 同时,由于框架经过这5-6年来的不断演进,以前发的早期教程已经太落后了,包括 ...
- CYQ.Data V5 从入门到放弃ORM系列:教程 - Log、SysLogs两个日志类使用
Log 静态类介绍: Public Static (Shared) Methods GetExceptionMessage 获取异常的内部信息 WriteLogToDB Overloaded. 将日志 ...
- CYQ.Data V5 从入门到放弃ORM系列:教程 - MAction类使用
背景: 随着V5框架使用者的快速增加,终于促使我开始对整个框架编写完整的Demo. 上周大概花了一星期的时间,每天写到夜里3点半,终完成了框架所有功能的Demo. 同时,按V5框架名称空间的顺序,对每 ...
- ASP.NET MVC 使用 Petapoco 微型ORM框架+NpgSql驱动连接 PostgreSQL数据库
前段时间在园子里看到了小蝶惊鸿 发布的有关绿色版的Linux.NET——“Jws.Mono”.由于我对.Net程序跑在Linux上非常感兴趣,自己也看了一些有关mono的资料,但是一直没有时间抽出时间 ...
- 最好的5个Android ORM框架
在开发Android应用时,保存数据有这么几个方式, 一个是本地保存,一个是放在后台(提供API接口),还有一个是放在开放云服务上(如 SyncAdapter 会是一个不错的选择). 对于第一种方式, ...
- Asp.Net Mvc通用后台管理系统,bootstrap+easyui+权限管理+ORM
产品清单: 1.整站源码,非编译版,方便进行业务的二次开发 2.通用模块与用户等基础数据的数据库脚本 3.bootstrap3.3.1 AceAdmin模板源码 4.easyui1.3.5源码 5.F ...
随机推荐
- Asp.Net 技术
Asp.Net 技术Nuget 管理器Spring.NET 框架Spring.core 包 微服务Consul .NetCore 框架:Spring.net Nhibernate 框架Dapper.n ...
- 2019 阿里java面试笔试总结 (含面试题解析)
本人5年开发经验.18年年底开始跑路找工作,在互联网寒冬下成功拿到阿里巴巴.今日头条.滴滴等公司offer,岗位是Java后端开发,因为发展原因最终选择去了阿里,入职一年时间了,也成为了面试官, ...
- pandas-19 DataFrame读取写入文件的方法
pandas-19 DataFrame读取写入文件的方法 DataFrame有非常丰富的IO方法,比如DataFrame读写csv文件excel文件等等,操作很简单.下面在代码中标记出来一些常用的读写 ...
- ECMA6新增语法(待续...)
块级作用域: ES6允许你使用块级作用域,不过目前大多数的ES6语法只允许在严格模式下使用("use strict” ). 1 let关键字 作用:声明变量,一个花括号就是一个作用域(每个 ...
- linux mysql连接
1. 添加头文件 # apt-get install libmysqlclient-dev 引入头文件 #include <mysql/mysql.h> 2. 举例 MYSQL *mysq ...
- 设计模式之JDK动态代理源码分析
这里查看JDK1.8.0_65的源码,通过debug学习JDK动态代理的实现原理 大概流程 1.为接口创建代理类的字节码文件 2.使用ClassLoader将字节码文件加载到JVM 3.创建代理类实例 ...
- 记录一次Oracle创建DBLink踩到小坑
1.查询当前是否具有创建DBlink的权限: select * from user_sys_privs where privilege like upper('%DATABASE LINK%'); 如 ...
- Linux 系统管理 : last 命令详解
原文 last命令用于显示用户最近登录信息.单独执行last命令,它会读取/var/log/wtmp的文件,并把该给文件的内容记录的登入系统的用户名单全部显示出来 语法 last(选项)(参数) 选项 ...
- Dockerfile(从无到有创建镜像)
本文原始地址:https://sitoi.cn/posts/43818.html 结构 DockerFile分为四部分组成: 基础镜像信息 维护者信息 镜像操作指令 容器启动时执行指令 基础镜像信息 ...
- 线性排序总结(c++实现)
前面介绍了一些常用的比较排序算法,它们都是通过比较两个元素的大小进行排序,归并排序和堆排序在最坏情况下的复杂度为O(nlgn),可以证明(使用决策树模型),通过比较进行排序,算法的下界为O(nlgn) ...