ORM映射

只要思想不滑坡,方法总比问题多

什么是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)
posted @ 2019-11-06 00:13  Mr-Allen  阅读(134)  评论(0编辑  收藏  举报