orm-1
2024-09-03 13:21:26
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)
最新文章
- elk系列8之logstash+redis+es的架构来收集apache的日志
- [转]asp.net解决高并发的方案.
- Windows-006-映射网络驱动器图文详解
- linux命令(3):复制,剪切(文件和文件夹)
- HTML5上传图片预览
- ActiveMQ之Topic
- PHP获取IP地址所在的地理位置
- crontab 配置
- 0,null,empty,空,false,isset
- C注意,使用的语言字符串
- Linux常用命令说明(记录自己Linux命令使用情况,后续会持续更新)
- SuperSocket基础一
- DAY19、日常模块
- python正则匹配示例
- 洛谷P3957 跳房子(Noip2017普及组 T4)
- css详细笔记
- [UE4]基于物理的材质
- 基于Redis的CAS集群
- C#游戏开发中快速的游戏循环
- 20155302《网络对抗》Exp9 Web安全基础