orm-1

    - ORM什么是?
        类名 ---> 数据库表
        对象 ---> 记录
        对象.属性 ---> 字段

    - ORM的优缺点:
        优点:
            可跨平台,可以通过对象.属性取值,对象.方法,让该方法内部执行SQL语句。比如:save --> insert into table...

        缺点:
            1.执行效率低
            2.程序员随着年龄的增长,会遗忘原生SQL语句。


2、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()

3、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)
posted @ 2019-11-06 21:22  black__star  阅读(87)  评论(0编辑  收藏  举报