orm连接mysql_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)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值