zoukankan      html  css  js  c++  java
  • 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)
  • 相关阅读:
    自定义Listview
    android ListView嵌套GridView显示不全问题
    Android-Universal-Image-Loader 图片异步加载类库的使用(超详细配置)
    android service被系统回收的解决方法
    android Activity基类通用方法
    用 FragmentManager 替换时使用 GoogleMaps 崩溃 app
    Gulp 从0开始
    面试题 之 全排列
    面试题之 query转为obj
    this .运算符 和 [] 运算符
  • 原文地址:https://www.cnblogs.com/shaozheng/p/11808775.html
Copyright © 2011-2022 走看看