zoukankan      html  css  js  c++  java
  • 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)
    我把月亮戳到天上 天就是我的 我把脚踩入地里 地就是我的 我亲吻你 你就是我的
  • 相关阅读:
    Android中的5种数据存储方式
    Android Service
    Android BroadcastReceiver
    Android Intent
    Android Fragment
    Android 教学实验计划1
    【Android教学用例程序】计算器
    Android UI 基础知识
    Android 控件
    Android 计算器布局测试2
  • 原文地址:https://www.cnblogs.com/zhulipeng-1998/p/12863922.html
Copyright © 2011-2022 走看看