使用python进行数据迁移重组之mysql工具类

#coding:utf-8
'''
这里暂时以mysql为主(可以对此类进行任意扩展)

使用方式:
print db.queryResults('表名',field=['id','字段二','字段三'])
insert = {'字段二':字段值,'字段三':字段三值}
print db.update('表名',insert,where='id=8')
print db.update('表名',insert,where='id=8',addfield='num=num+1')

'''
import MySQLdb
import logging
import warnings
warnings.filterwarnings("ignore")

CLIENT_LONG_PASSWORD = 1
CLIENT_FOUND_ROWS = 1 << 1
CLIENT_LONG_FLAG = 1 << 2
CLIENT_CONNECT_WITH_DB = 1 << 3
CLIENT_NO_SCHEMA = 1 << 4
CLIENT_COMPRESS = 1 << 5
CLIENT_ODBC = 1 << 6
CLIENT_LOCAL_FILES = 1 << 7
CLIENT_IGNORE_SPACE = 1 << 8
CLIENT_PROTOCOL_41 = 1 << 9
CLIENT_INTERACTIVE = 1 << 10
CLIENT_SSL = 1 << 11
CLIENT_IGNORE_SIGPIPE = 1 << 12
CLIENT_TRANSACTIONS  = 1 << 13
CLIENT_SECURE_CONNECTION = 1 << 15
CLIENT_MULTI_STATEMENTS = 1 << 16
CLIENT_MULTI_RESULTS = 1 << 17
CLIENT_CAPABILITIES = CLIENT_LONG_PASSWORD|CLIENT_LONG_FLAG|CLIENT_TRANSACTIONS| \
                        CLIENT_PROTOCOL_41|CLIENT_SECURE_CONNECTION


logger = logging.getLogger('django')

class mydb:
    cur = None
    conn = None

    def _init_(self,**agrs):
        conv = MySQLdb.converters.conversions.copy()
        conv[12] = str #convert datetime to string in MySQLdb.converters.constans.FIELD_TYPE
        self.conn = MySQLdb.connect(host=agrs['host'],port=agrs['port'],db=agrs['db'],\
                              user=agrs['user'],passwd=agrs['pwd'],\
                              charset='utf8',conv=conv,\
                              client_flag=CLIENT_MULTI_STATEMENTS|CLIENT_MULTI_RESULTS
                              )
        self.cur = self.conn.cursor()
        self.cur.execute('SET NAMES utf8')

    def __init__(self,**agrs):
        #conv = MySQLdb.converters.conversions.copy()
        #conv[12] = str #convert datetime to string in MySQLdb.converters.constans.FIELD_TYPE
        self.conn = MySQLdb.connect(host=agrs['host'],port=agrs['port'],db=agrs['db'],\
                              user=agrs['user'],passwd=agrs['pwd'],\
                              charset='utf8',\
                              client_flag=CLIENT_MULTI_STATEMENTS|CLIENT_MULTI_RESULTS
                              )
        self.cur = self.conn.cursor()
        self.cur.execute('SET NAMES utf8')
        

    #普通完整查寻
    def query(self,sql):
#        print("query: %s "%sql.encode('utf-8'))
        res = self.cur.execute(sql)
        res = self.cur.fetchall()
        return res

    #获取一个结果
    def fetchone(self,sql):
        res = self.cur.execute(sql)
        res = self.cur.fetchone()
        return res
    
    #获取查寻结果,如果没有指定field会出错,因此如果是获取所有字段就必须显式的全部指定
    def queryResults(self,table,**agrs):           
        field = ','.join(['%s'%(x) for x in agrs['field']]) if 'field' in agrs else '*'
        where = 'where %s'%(agrs['where']) if 'where' in agrs else ''
        groupby = 'group by %s'%(agrs['groupby']) if 'groupby' in agrs else ''
        order = 'order by %s'%(agrs['order']) if 'order' in agrs else ''
        limit = 'limit %s'%(agrs['limit']) if 'limit' in agrs else ''
        sql = 'select %s from %s %s %s %s %s'%(field,table,where,groupby,order,limit)
        #logger.debug("queryResults:%s", %sql.encode('utf-8'))
#        print "queryResults:%s"%(sql)

        self.cur.execute(sql)
        res = []
        #这里处理成字典形式,方便直接用字段访问值
        '''
         实际上这里还可以这样(以字段形式返回):
                cur = self.conn.cursor(MySQLdb.cursors.DictCursor)
                cur.execute(sql)
                print cur.fetchall()  
        '''
        for line in self.cur.fetchall():
            getline = {}
            for i,v in enumerate(line):
                getline[agrs['field'][i]] = v
            res.append(getline)

        return res

    #插入
    '''
        data为一个字典对象:{'xxx':'xx','xxx':'xxx'}
    '''
    def insert(self,table,data,**args):
        field = ','.join(['`%s`'%(x) for x in data.keys()])
        #print field
        values = []
        for x in data.values():
            if x==None:
                y='NULL'
                values.append(y)
            else:
                if isinstance(x,str) or isinstance(x,unicode):
                    x="'"+x+"'"
                else:
                    x="'"+str(x)+"'"
                values.append(x)
        values = ','.join(["%s"%(x) for x in values]).replace('\\','')
        #print values
        #values = ','.join(["'%s'"%(x) for x in data.values()])
        sql='insert into `%s`(%s) values(%s)'%(table,field,values)
        #print sql
        #print("insert: %s "%sql.encode('utf-8'))
        self.cur.execute(sql)
        
        willcommit = args['commit'] if 'commit' in args else True
        if willcommit:  
            self.conn.commit()
        ids = int(self.getInsertID())
        return  ids

    #更新操作
    def update(self,table,data,**agrs):
        '''
            data为字典对象,更新的字段是非数据库增加值,
            如果有 field=field+1此类字段(addfield),请写在关键字参数里
            addfield:field=field+1
        '''
        field = ','.join(["`%s`='%s'"%(k,data[k]) for k in data])
        field += ',%s'%(agrs['addfield']) if 'addfield' in agrs else ''
        where = 'where %s'%(agrs['where']) if 'where' in agrs else ''
        limit = 'limit %s'%(agrs['limit']) if 'limit' in agrs else 'limit 1'
        sql='update `%s` set %s %s %s'%(table,field,where,limit)
        #print sql
        logger.debug("update:%s", sql)
        res = self.cur.execute(sql)
        self.conn.commit()
        return  res
    
     #更新操作
    def updateBysql(self,sql):
        logger.debug("update:%s", sql)
        res = self.cur.execute(sql)
        self.conn.commit()
        return  res

    #获取刚刚插入的ID
    def getInsertID(self):
        sql = 'select last_insert_id() as id'
        res = self.fetchone(sql)[0]
        return res 

    #删除
    def delete(self,table,**agrs):
        where = 'where %s'%(agrs['where']) if 'where' in agrs else ''
        limit = 'limit %s'%(agrs['limit']) if 'limit' in agrs else ''
        willcommit = agrs['commit'] if 'commit' in agrs else True
        sql = 'delete from `%s` %s %s'%(table,where,limit)
        logger.debug("delete sql:%s, willcommit:%s", sql, willcommit)
        res = self.cur.execute(sql)
        if willcommit:
            self.conn.commit()
        return res

    #替换单引号
    def qutoSin(self,string):
        if string:
            return string.replace("'",'"')
        return string

    #获取数据库下面的所有表名
    def showTables(self):
        r = []
        res = []
        self.cur.execute("show tables")
        r = self.cur.fetchall()
        for (table_name,) in r:
            res.append(table_name)
        return res

    #获取查询到的总数
    def getCount(self,table,**agrs):
        where = 'where %s'%(agrs['where']) if 'where' in agrs else ''
        sql = 'select count(*) from %s %s'%(table,where)
        logger.debug("getCount sql:%s", sql)
        
        self.cur.execute(sql)
        count = self.cur.fetchone()[0]
        return count

    def commit(self):
        self.conn.commit()
        
    def rollback(self):
        self.conn.rollback()
        

    #释放资源
    def __del__(self):
        if self.cur:
            self.cur.close()
            self.cur = None
        if self.conn:
            self.conn.close()
            self.conn = None

    #获取查寻结果(何净)
    def querySql(self,sql,**agrs):
        logger.debug("queryResults:%s", sql)
#        print("queryResults:%s"%sql)
        #self.cur.execute(sql)
        self.cur.execute(sql)
        res = []
        #这里处理成字典形式,方便直接用字段访问值
        '''
         实际上这里还可以这样(以字段形式返回):
                cur = self.conn.cursor(MySQLdb.cursors.DictCursor)
                cur.execute(sql)
                print cur.fetchall()  
        '''
       # for line in self.cur.fetchall():
        for line in self.cur.fetchall():
            getline = {}
            for i,v in enumerate(line):
                getline[agrs['field'][i]] = v
            res.append(getline)
    
        return res

    def close(self):
        if self.cur:
            self.cur.close()
            self.cur = None
        if self.conn:
            self.conn.close()
            self.conn = None

#实例化
#db = db(host='xxxx',db='xxxx',user='xxxx',pwd='xxxx')


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值