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)
    我把月亮戳到天上 天就是我的 我把脚踩入地里 地就是我的 我亲吻你 你就是我的
  • 相关阅读:
    忏悔书(IT攻城狮)
    【博文汇总】彩色图像分割 Menu
    【Android】Android 4.2源码下载(ubuntu 12.10)
    【My Project】织物疵点检测机器视觉系统 软件测试平台
    【NFC】Android NFC API Reference中英文
    【分享】RSS订阅技巧及工具和实用RSS链接分享
    【流媒體】live555—VS2010/VS2013 下live555编译、使用及测试
    vc++ win32项目属性介绍(二、c/c++)
    c风格回调函数 vs c++风格虚基类,关于接口定义和调用的对比
    关于移动技术的我的看法(二)
  • 原文地址:https://www.cnblogs.com/zhulipeng-1998/p/12863922.html
Copyright © 2011-2022 走看看