只要思想不滑坡,方法总比问题多
什么是orm?orm的优缺点。
orm是对象映射关系,映射到数据库MySQL中的数据表
类名-->表名
对象-->一条记录
对象.属性-->字段
优点:
使用者无需关心SQL命令,如何编写.直接通过调用方法,来执行相对应的 SQL命令
缺点:
更高级的封装导致'执行率变低'
会忘了SQL原生命令
手撸Mysql连接类、ORM封装类的ORM-select、ORM-insert、ORM-update方法。
##MySQL连接类
class MySQLClient:
#创建连接并获取游标
def __init__(self):
#连接客户端
self.client = pymysql.connect(
host='127.0.0.1',
port=3306,
user='root',
password='123',
database='user',
charset='utf8',
autocommit=true
)
self.cursor = self.client.cursor(
pymysql.cursor.DictCursor
)
#提交查询SQL命令
def select(self, sql, value=None):
#提交查询的SQL命令
self.cursor.execute(sql, value)
#获取查询以后的结果
res = self.cursor.fetchall()
return res
#封装"提交SQL命令,插入或者更新操作"的方法
def execute(self, sql, values):
try:
self.cursor.execute(sql, values)
except Exception as e:
print(e)
#关闭数据库
def close(self):
self.cursor.close()
self.client.close()
#查询方法
@classmethod
def orm_select(cls, **kwargs):
mysql = MySQLClient()
if not kwargs:
sql = 'select *from %s' % cls.table_name
res = mysql.select(sql)
else:
#dict.keys()返回的是一个对象,需要转换成list类型
key = list(kwargs.keys())[0]
value = kwargs.get(key)
#条件查询
sql = 'select *from %s where %s=?' % (cls.table_name,key)
#需要拿到MySQL的游标,提交SQL语句
sql = sql.replance('?', '%s')
res = mysql.select(sql, value)
return [cls(**d) for d in res]
#插入方法
def orm_insert(self):
mysql = MySQLClient()
#存字段名
keys = []
#存字段对应的值
values = []
#存放?号的,有几个字段,就村几个?号
args = []
for k, v in self.mapping.items():
if not v.primary_key:
keys.append(v.name)
#村表中除了主键以外的字段值,若值没有,则使用默认值
values.append(
getattr(self, v.name, v.default)
)
#存放?号的,有几个字段,就存几个?号
args.append('?')
sql = 'insert into %s(%s) values(%s)' %(
self.table_name,
','.join(keys),
','.join(args)
)
sql = sql.replace('?', '%s')
mysql.execute(sql,values)
#更新方法
def orm_update(self):
mysql = MySQLCilent()
#字段名
keys = []
#字段值
values = []
#主键,id=PK
primary_key = None
for k, v in self.mapping.items():
if v.primary_key:
primary_key = v.name + '=%S' % getatter(self, v.name)
else:
keys.append(v.name + '=?')
values.append(
getatter(self, v.name)
)
#注意,坦克的更新方法,更新条件固定使用主键.
sql = 'update %s set %s where %s' % (
self.table_name,
','.join(keys),
primary_key
)
sql = sql.replace('?','%s')
mysql.execute(sql, values)