zoukankan      html  css  js  c++  java
  • 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)
    
  • 相关阅读:
    hdu 2019 数列有序!
    hdu 2023 求平均成绩
    HDU 5805 NanoApe Loves Sequence (思维题) BestCoder Round #86 1002
    51nod 1264 线段相交
    Gym 100801A Alex Origami Squares (求正方形边长)
    HDU 5512 Pagodas (gcd)
    HDU 5510 Bazinga (字符串匹配)
    UVALive 7269 Snake Carpet (构造)
    UVALive 7270 Osu! Master (阅读理解题)
    UVALive 7267 Mysterious Antiques in Sackler Museum (判断长方形)
  • 原文地址:https://www.cnblogs.com/793564949liu/p/11801683.html
Copyright © 2011-2022 走看看