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)
posted @ 2019-11-05 21:15  断指轩辕  阅读(192)  评论(0编辑  收藏  举报