1105 ROM优缺点,MySQL连接类,查插更方法
ROM
对象关系映射,映射到数据库中的数据表
优点:
使用者不要关心SQL命令具体怎么编写
直接调用方法,来执行对应的SQL命令
缺点:
高级封装导致效率变低
会忘记SQL语句
MySQL连接类
class MySQLClient:
#创建连接并获取游标
def __init__(self):
self.client = pymysql.connect(
host = '127.0.0.1',
port = 3306,
user = 'root',
password = '123',
database = 'orm_demo',
charset = 'utf8',
autocommit = True
)
self.cursor = self.client.cursor(
pymysql.cursors.DictCursor
)
#提交查询SQL命令
def my_select(self,sql,value=None):
#提交查询的SQL命令
self.cursor.execute(sql,value)
#获取查询之后的结果
res = self.cursor.fetchall()
return res
#封装SQL的插入和更新操作
def my_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()
orm_select
查询方法
#绑定给类的方法
@classmethod
def orm_select(cls,**kwargs):
#调用MySQLClient拿到mysql对象
mysql = MySQLClient()
if not kwargs:
#查询所有 SQL语句:select * from 表名;
sql = "select * from %s" % cls.table_name
res = mysql.my_select(sql)
else:
#返回的是一个对象,需要转成list类型
key = list(kwargs.keys())[0]
values = kwargs.get(key)
#条件查询 SQL语句:select * from 表名 where id=1;
sql = 'select * from %s where %s=?' % (cls.table_name,key)
sql = sql.replace('?','%s')
#需要拿到MySQL的游标,提交SQL语句
res = mysql.my_select(sql,value)
return [cls(**d) for d in res]
orm_insert
插入方法
def orm_insert(self):
mysql = MySQLClient()
#存储字段名
keys = []
#存字段对应的值
values = []
#存放?的,有几个字段,就有几个?
args = []
for k,v in self.mappings.items():
#过滤掉主键,以为主键是自增的
if not v.primary_key:
#存储,除了主键以外的字段名
keys.append(v.name)
#存储,除了主键以外的字段值
values.append(
getattr(self,v.name,v.default)
)
#存储?,有几个字段,就有几个?
args.append('?')
#SQL语句:insert into table_name(v1,v2) values (?,?);
sql = 'insert into %s(%s) values(%s)'%(self.table_name,
",".join(keys),
",".join(args)
)
#SQL语句:insert into table_name(v1,v2) values (%s,%s);
sql = sql.replace('?',"%s")
mysql.my_execute(sql,values)
orm_update
更新方法
def orm_update(self):
mysql = MySQLClient()
#字段名
keys = []
#字段值
values = []
#主键
primary_key = None
for k,v in self.mappings.item():
if v.primary_key:
primary_key = v.name + '%s' % getattr(self,v.name)
else:
keys.append(v.name + '?')
values.append(
getattr(self,v.name)
)
#注意:更新条件约定俗成使用主键
sql = 'update %s set %s where %s' % (
self.table_name,
','.join(keys),
primary_key
)
#SQL语句:update table set k1=%s,k2=%s where id=pk;
sql = sql.replace('?','%s')
mysql.my_execute(sql,values)