python3的方法链风格的操作mysql的类

### python3的方法链风格的操作mysql的类

  • 基于mysql官方提供的python3的连接插件 代码初始如下,还没有时间来完善,比如加入查询缓存
#coding=utf-8
import mysql.connector
import os
class MyDB:
    '''mysql数据库操作类 包地址:http://dev.mysql.com/downloads/connector/python/

    使用示例(传入配置文件):
    dbdb = MyDB(config["dbconf_mysql"])


    # 查询
    wdata={}
    wdata["title"]=["like","%九寨%"]
    mr=dbdb.tbname("gentuanyou")
    rs=mr.field("gentuanyouid,title").where(wdata).limit("0,5").order("gentuanyouid asc").select()
    print(mr.lastsql)
    print(rs)


    #  更新操作
    rs=mr.where(wdata).save(data)

    # 删除操作
    rs=mr.where(wdata).delete()

    # 添加操作
    data={}
    data["title"]="张三四2"
    data["type"]="e22"
    mr.add(data)


    '''
    cnx=""
    cursor=""
    wheredirt ={} #存放要生成查询的条件
    orderstr="" # 生成后的排序语句
    tbname="" #此次操作的tbname
    fieldname="*"  # 此次要查询的字段
    qz="" # 数据表前缀
    limitstr="" #sql的限制部份
    groupstr=""  #sql的groupby部份
    lastsql="" # 最近执行的sql
    savedict={}
    joinstr="" #两表联查生成sql

    def __init__(self,db=None):
        '''类例化,一般处理一些连接操作'''
        
        self.qz=db["qz"]
        self.cnx = mysql.connector.connect(user=db["user"],passwd=db["passwd"],host=db["host"],port=db["port"], database=db["dbname"])
        self.cursor = self.cnx.cursor()

    def initcs(self):
        '''恢复一些参数,以便下次调用'''
        self.wheredirt ={} #存放要生成查询的条件
        self.orderstr="" # 生成后的排序语句
        self.fieldname="*"  # 此次要查询的字段
        self.limitstr="" #sql的限制部份
        self.groupstr=""  #sql的groupby部份
        self.savedict={}
        self.joinstr="" #两表联查生成sql



    def createquerysql(self):
        '''构建查询的语句'''
        temps=""
        for k in self.wheredirt:
            sqls=""
            if(type(self.wheredirt[k])==list):
                v=self.wheredirt[k]
                v[1]=self.escape(v[1])
                if v[0]=="eq":
                    sqls= type(v[1])==str  and  "='"+v[1]+"'" or  "="+str(v[1])
                if v[0]=="neq":
                    sqls= type(v[1])==str  and  "<>'"+v[1]+"'" or  "<>"+str(v[1])
                if v[0]=="gt":
                    sqls= type(v[1])==str  and  ">'"+v[1]+"'" or  ">"+str(v[1])
                if v[0]=="lt":
                    sqls= type(v[1])==str  and  "<'"+v[1]+"'" or  "<"+str(v[1])
                if v[0]=="exp":
                    sqls=" "+v[1]
                if v[0]=="like":
                    sqls=" like '"+v[1]+"'"
            else:
                sqls= type(self.wheredirt[k])==str  and  "='"+self.escape(self.wheredirt[k])+"'" or  "="+str(self.wheredirt[k])
                #sqls="=%("+k+")s"

            temps="and   ("+k+sqls+") "+temps

        temps=temps[3:]
        return temps
        


    def createupdatesql(self):
        '''构建保存的语句 savedict'''
        temps=""
        for k in self.savedict:
            sqls= type(self.savedict[k])==str  and  "='"+self.escape(self.savedict[k])+"' " or  "="+self.savedict[k]+""
            temps=temps+" "+k+sqls+" "+","

        temps=temps[0:-1]
        return temps

    def select(self):
        '''结合where里的用select法去查询'''
        temps=self.createquerysql()
        sql="select "+self.fieldname+" from "+self.qz+self.tbname
        
        if self.joinstr!="":
            sql=sql+self.joinstr

        if temps!="":
            sql=sql+" where "+temps
        if self.groupstr!="" :
            sql=sql+" group by "+self.groupstr
        if self.orderstr!="":
            sql=sql+" order by "+self.orderstr

       
        if self.limitstr!="" :
            sql=sql+" limit "+self.limitstr

        
        self.initcs() #回收一些参数
        return self.fetchall(sql)

    def find(self):
        temps=self.createquerysql()
        sql="select "+self.fieldname+" from "+self.qz+self.tbname
        if self.joinstr!="":
            sql=sql+" "+self.joinstr

        if temps!="":
            sql=sql+" where "+temps
        if self.groupstr!="" :
            sql=sql+" group by "+self.groupstr
        if self.orderstr!="":
            sql=sql+" order by "+self.orderstr

        sql=sql+" limit 0,1"
        self.initcs() #回收一些参数
        return self.fetchone(sql)


    def delete(self):
        '''删除操作,避免删除所有的记录,where部份不能为空'''
        temps=self.createquerysql()
        if len(temps)<5: return False
        sql="delete from "+self.qz+self.tbname +" where "+temps
        
        self.initcs() #回收一些参数
        self.lastsql=sql
        print(sql)
        return self.execute(sql)



    def add(self,dict1):
        '''添加操作'''
        self.savedict=dict1

        sql_data=self.createaddsql()

        sql="insert into "+self.qz+self.tbname+" "+sql_data
        try:
            self.lastsql=sql
            self.cursor.execute(sql)
            lastrowid=self.cursor.lastrowid
            self.cnx.commit()
            return lastrowid
        except:
            return 0
        finally:
            self.initcs()

        #return self.execute(sql,self.savedict)

    def createaddsql(self):
        '''生成插入的sql语句'''
        temps_k=""
        temps_v=""
        for k in self.savedict:
            temps_k=temps_k+k+","
            temps_v= type(self.savedict[k])==str  and  temps_v+" '"+self.escape(self.savedict[k])+"',"\
             or  temps_v+" "+str(self.savedict[k])+","
            #temps_v+= " %("+k+")s,"
            
            

        temps=""
        temps_k=temps_k[0:-1]
        temps_v=temps_v[0:-1]
        if temps_k!="" : temps="("+temps_k+") values ("+temps_v+")"
        return temps



    def save(self,dict1):
        '''保存值'''
        self.savedict=dict1
        if len(self.wheredirt)<1: return False
        sql_data=self.createupdatesql()
        sql_where=self.createquerysql()
        sql="update "+self.qz+self.tbname+" set "+sql_data
        if sql_where!="" :
            sql+=" where "+sql_where
        
        #print(sql)
        try:
            flags=self.cursor.execute(sql)
            #lastid=self.cursor.lastrowid #要在commit()前,不然会返回0
            self.cnx.commit()
            self.initcs()
            return True
        except:
            return False



    def join(self,str1):
        '''两表联查生成sql'''
        self.joinstr=self.joinstr+" "+str1
        return self


    def limit(self,str1):
        '''构建limit部份'''
        self.limitstr=str1
        return self

    def group(self,str1):
        '''sql语句的group by部份'''
        self.groupstr=str1
        return self

    def table(self,str1,qz=""):
        '''传入此次查询的表名'''

        self.tbname=str1
       
        if qz!="" :
            self.qz=qz
        return self

    def field(self,str1):
        self.fieldname=str1
        return self


    def order(self,str1):
        '''生成排序的语句'''
        if str1!="" : 
            self.orderstr=str1
        return self


    def formatrs(self,rows):
        '''为查询的数据结果加字段名处理,
        fieldname是返回的字段名列表,
        rows是返回的数据列表
        '''
        r=[]
        for x in rows:
            r.append(dict(zip(self.cursor.column_names,x)))
        return r

    def fetchall(self,sql):
        '''查询数据,返回一个列表,里面的每一行是一个字典,带字段名
             cursor 为连接光标
             sql为查询语句
        '''
        try:
            self.lastsql=sql
            self.cursor.execute(sql)
            rows=self.cursor.fetchall()
            return self.formatrs(rows)
        except:
            return False
        

    def execute(self,sql):
        '''
        插入或更新记录 成功返回最后的id
        '''
        self.cursor.execute(sql)
        self.cnx.commit()
        return self.cursor.lastrowid

    def where(self,dist1):
        if type(dist1)!=dict: return False
        self.wheredirt=dist1
        return self

    def fetchone(self,sql):
        '''获取单行'''
        self.lastsql=sql
        self.cursor.execute(sql)
        rows=self.cursor.fetchone()
        if rows==None: return {}
        return dict(zip(self.cursor.column_names,rows))

    def escape(self,str1):
        '''针对字符串做转义'''
        return str1.replace("\"","\\\"").replace("\'","\\\'")

    def close(self):
        '''结束查询和关闭连接'''
        self.cnx.close()
        self.cursor.close()


    def getpath(self):
        '''获取调用文件的目录,而不是此文件的目录'''
        return os.getcwd()




转载于:https://my.oschina.net/yybjroam/blog/807178

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值