1105 ROM优缺点,MySQL连接类,查插更方法

前提是你 提交于 2019-12-03 15:10:50

ROM

对象关系映射,映射到数据库中的数据表
优点:
使用者不要关心SQL命令具体怎么编写
直接调用方法,来执行对应的SQL命令
缺点:
高级封装导致效率变低
会忘记SQL语句

MySQL连接类

class MySQLClient:
    #创建连接并获取游标
    def __init__(self):
        self.client = pymysql.connect(
            host = '127.0.0.1',
            port = 3306,
            user = 'root',
            password = '123',
            database = 'orm_demo',
            charset = 'utf8',
            autocommit = True
        )
        self.cursor = self.client.cursor(
            pymysql.cursors.DictCursor
        )
        
    #提交查询SQL命令
    def my_select(self,sql,value=None):
        #提交查询的SQL命令
        self.cursor.execute(sql,value)
        #获取查询之后的结果
        res = self.cursor.fetchall()
        return res
        
    #封装SQL的插入和更新操作
    def my_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()

orm_select

查询方法

#绑定给类的方法
@classmethod
def orm_select(cls,**kwargs):
    #调用MySQLClient拿到mysql对象
    mysql = MySQLClient()
    if not kwargs:
        #查询所有  SQL语句:select * from 表名;
        sql = "select * from %s" % cls.table_name
        res = mysql.my_select(sql)
    else:
        #返回的是一个对象,需要转成list类型
        key = list(kwargs.keys())[0]
        values = kwargs.get(key)
        #条件查询  SQL语句:select * from 表名 where id=1;
        sql = 'select * from %s where %s=?' % (cls.table_name,key)
        sql = sql.replace('?','%s')
        #需要拿到MySQL的游标,提交SQL语句
        res = mysql.my_select(sql,value)
    return [cls(**d) for d in res]

orm_insert

插入方法

def orm_insert(self):
    mysql = MySQLClient()
    #存储字段名
    keys = []
    #存字段对应的值
    values = []
    #存放?的,有几个字段,就有几个?
    args = []
    
    for k,v in self.mappings.items():
        #过滤掉主键,以为主键是自增的
        if not v.primary_key:
            #存储,除了主键以外的字段名
            keys.append(v.name)
            #存储,除了主键以外的字段值
            values.append(
                getattr(self,v.name,v.default)
            )
            #存储?,有几个字段,就有几个?
            args.append('?')
        #SQL语句:insert into table_name(v1,v2) values (?,?);
        sql = 'insert into %s(%s) values(%s)'%(self.table_name,
            ",".join(keys),
            ",".join(args)
        )
        #SQL语句:insert into table_name(v1,v2) values (%s,%s);
        sql = sql.replace('?',"%s")
        mysql.my_execute(sql,values)

orm_update

更新方法

def orm_update(self):
    mysql = MySQLClient()
    #字段名
    keys = []
    #字段值
    values = []
    #主键
    primary_key = None
    for k,v in self.mappings.item():
        if v.primary_key:
            primary_key = v.name + '%s' % getattr(self,v.name)
        else:
            keys.append(v.name + '?')
            values.append(
                getattr(self,v.name)
            )
    #注意:更新条件约定俗成使用主键
    sql = 'update %s set %s where %s' % (
        self.table_name,
        ','.join(keys),
        primary_key
    )
    #SQL语句:update table set k1=%s,k2=%s where id=pk;
    sql = sql.replace('?','%s')
    mysql.my_execute(sql,values)
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!