• mysql连接类与ORM的封装


    ORM:
            - ORM什么是?
                类名 ---> 数据库表
                对象 ---> 记录
                对象.属性 ---> 字段
    
            - ORM的优缺点:
                优点:
                    可跨平台,可以通过对象.属性取值,对象.方法,让该方法内部执行SQL语句。比如:save --> insert into table...
        
                缺点:
                    1.执行效率低
                    2.程序员随着年龄的增长,会遗忘原生SQL语句。
    
    
        MySQL连接类:
            import pymysql
            class MySQLClient():
                def __init__(self):
                    # 1.连接数据库客户端
                    self.client = pymysql.connect(
                        host
                        port
                        user
                        password
                        database
                        charset='utf8'
                        autocommit=True
                    )
        
                    # 2.获取数据库游标
                    self.cursor = self.client.cursor(
                        pymysql.cursors.DictCursor
                    )
        
                # 查询方法
                def my_select(self, sql, value=None):
                    # 1.提交sql语句
                    self.cursor.execute(sql, value)
        
                    # 2.获取数据库查询返回的结果
                    res = self.cursor.fetchall()
        
                    return res
        
                # 插入或更新方法sql提交
                def my_execute(self, sql, value):
        
                    try:
                        # 提交sql语句
                        self.cursor.execute(sql, value)
        
                    except Exception as e:
                        print(e)
    
    
                def close(self):
                    # 关闭游标
                    self.cursor.close()
                    # 关闭数据库连接
                    self.client.close()
        
        ORM封装的查、增、改
            from mysql_py import MySQLClient
        
            查
            @classmethod   User.orm_select(name=tank)
            def orm_select(cls, **kwargs):  # name=tank, age=18  ---> {name:tank, }
                mysql = MySQLClient()
                # 如果没有查询条件
                if not kwargs:
                    # sql: select * from table_name;
                    sql = 'select * from %s' % cls.table_name
                    res = mysql.my_select(sql)
        
                # 如果有查询条件
                else:
                    key = list(kwargs.keys())[0]
                    value = kwargs.get(key)
                    sql = 'select * from %s where %s=?' % (cls.table_name, key)
                    sql = sql.replace('?', '%s')
                    res = mysql.my_select(sql, value)
        
                # res ---> [{}, {}, {}] ------> [obj, obj. obj]
                # 将普通字典对象转为特殊字典对象---> 给普通字典对象添加了  对象.属性 取值/存值得方式。
                return [cls(**r) for r in res]  # **{k:v, k2: v2} ---> k=v, k2=v2
        
            增: insert into
            def orm_insert(self):
                mysql = MySQLClient()
                # sql: insert into table_name(f1, f2..) values(v1, v2..);
                key_list = []
                value_list = []
                args_list = []
        
                for k, v in self.mappings.items():
                    # k--》字段名
                    # v--》字段对象
                    if not v.primary_key:
                        # 获取字段名
                        key_list.append(v.name)
                        # key_list.append(k)
        
                        # 获取字段值
                        value_list.append(
                            # 通过反射获取字段的值: 反射可以通过字符串获取对象的属性值
                            getattr(self, v.name, v.default)  # 若v.name没有值,则使用默认值
                        )
        
                        args_list.append('?')
        
                # 'insert into %s(%s) values(???)'
                sql = 'insert into %s(%s) values(%s)' % (
                self.table_name, ','.join(key_list),
                ','.join(args_list)
                )
        
                sql = sql.replace('?', '%s')
                mysql.my_execute(sql, value_list)
        
            改: update table_name set k=v, k2=v2 where id=pk_val;
            def orm_update(self):
                mysql = MySQLClient()
                key_list = []
                value_list = []
                primary_key = None
        
                for k, v in self.mappings.items():
                    # 1.获取主键与主键对应的值
                    if v.primary_key:
                        primary_key = v.name + '=%s' % getattr(self, v.name)
        
                    else:
                        key_list.append(
                            v.name + '=?'
                        )
        
                        value_list.append(
                            getattr(self, v.name)
                        )
        
                sql = 'update %s set %s where %s' % (
                    self.table_name,
                    ','.join(key_list),
                    primary_key
                    )
        
                sql = sql.replace('?', '%s')
        
                mysql.my_execute(sql, value_list)
    
    
  • 相关阅读:
    【转】【WCF】WCF中客户端生成代理的两种方式
    【WPF】鼠标拖拽功能DragOver和Drop
    【转】【Android】Android不同版本下Notification创建方法
    【C#】获取电脑DPI
    【转】7Z命令行解压缩
    【转】【C#】ZIP、RAR 压缩与解压缩
    【MySQL】字符串截取之substring_index
    【转】【Java/Android】Intent的简介以及属性的详解
    友盟分享和cocos2dx符合重复duplicate symbol 解决方案
    slimphp中间件调用流程的理解
  • 原文地址:https://www.cnblogs.com/jinhongquan/p/11849920.html
Copyright © 2020-2023  润新知