设为首页 收藏本站
查看: 771|回复: 0

[经验分享] Python封装的访问MySQL数据库的类及DEMO

[复制链接]
累计签到:1 天
连续签到:1 天
发表于 2014-4-16 09:15:50 | 显示全部楼层 |阅读模式
# Filename:mysql_class.py
# Author:Rain.Zen; Date: 2014-04-15

import MySQLdb

class MyDb:

    '''初始化[类似于构造函数]'''
    def __init__(self, host, user, password, charset = 'utf8'):
        self.host = host
        self.user = user
        self.password = password
        self.charset = charset
        try:
            self.conn = MySQLdb.connect(host = self.host, user = self.user, passwd = self.password, charset = self.charset)
            self.cur = self.conn.cursor()
        except MySQLdb.Error as e:
            print('MySQL Error %d: %s' % (e.args[0], e.args[1]))

    '''组合字符串'''
    def joinData(self, data, char = ','):
        return char.join(data)

    '''解析条件语句,参数类型[{dict}, 'AND|OR'] | {dict}'''
    def parseMap(self, condition) :
        if isinstance(condition, list) :
            dictMap = condition[0]
            logic = ' '+ condition[1] +' '
        else :
            dictMap = condition
            logic = ' AND '

        if isinstance(dictMap, dict) :
            for k, v in dictMap.items():
                dictMap[k] = "`"+ k +"` = '"+ str(v) +"'"
            return self.joinData(dictMap.values(), logic)
        else :
            return '1 = 1'

    '''选择数据表'''
    def selectDb(self, db):
      try :
          self.conn.select_db(db)
      except MySQLdb.Error as e:
          print('MySQL Error %d: %s' % (e.args[0], e.args[1]))

    '''执行SQL语句'''
    def query(self, sql):
        try :
            return self.cur.execute(sql)
        except MySQLdb.Error as e:
            print 'MySQL Error: %s \nSQL: %s' % (e, sql)

    '''添加一条信息'''
    def addOne(self, table, dictData):
        for field, value in dictData.items():
            dictData[field] = "'"+ str(value) +"'"
        self.query('INSERT INTO ' + table + "("+ self.joinData(dictData.keys()) +') VALUES('+ self.joinData(dictData.values()) +')')
        return self.cur.lastrowid

    '''修改一条信息[根据条件]'''
    def saveOne(self, table, dictData, condition):
        for key, val in dictData.items():
            dictData[key] = "`"+ key +"` = '"+ str(val) +"'"
        save_sql = 'UPDATE ' + table + ' SET ' + self.joinData(dictData.values()) + ' WHERE ' + self.parseMap(condition)
        return self.query(save_sql)

    '''删除信息[根据条件]'''
    def deleteOne(self, table, condition):
        return self.query('DELETE FROM ' + table + ' WHERE ' + self.parseMap(condition))

    '''读取单条信息[根据条件]'''
    def fetchOne(self, tabel, condition, fields = '*', dataType = 0):
        field = isinstance(fields, list) and self.joinData(fields) or fields
        self.query('SELECT '+ field +' FROM ' + tabel + ' WHERE ' + self.parseMap(condition))
        tupleData = self.cur.fetchone()
        if dataType == 0 or fields == '*' :
            return tupleData
        else :
            dictData = {}
            n = 0
            for k in fields:
                dictData[k] = tupleData[n]
                n = n + 1
            return dictData

    '''读取多条信息[根据条件]'''
    def fetchSome(self, tabel, condition, fields = '*', dataType = 0):
        field = isinstance(fields, list) and self.joinData(fields) or fields
        self.query('SELECT '+ field +' FROM ' + tabel + ' WHERE ' + self.parseMap(condition))
        tupleData = self.cur.fetchall()
        count = self.cur.rowcount
        if count > 0:
            if dataType == 0 or fields == '*' :
                return (int(count), tupleData)
            else :
                listData = []
                for row in tupleData:
                    dictData = {}
                    n = 0
                    for k in fields:
                        dictData[k] = row[n]
                        n = n + 1
                    listData.append(dictData)
                return (int(count), listData)
        else:
            return False

    '''获取信息总数[根据条件]'''
    def getCount(self, tabel, condition = 0):
        where = isinstance(condition, dict) and ' WHERE ' + self.parseMap(condition) or ''
        self.query('SELECT 0 FROM ' + tabel + where)
        return self.cur.rowcount

    '''提交事务'''
    def commit(self):
        self.conn.commit()

    '''关闭句柄和连接'''
    def close(self):
        self.cur.close()
        self.conn.close()

DEMO
# Filename: test_mysql.py

from mysql_class import MyDb

'''测试开始'''

'''连接数据库[实例化]'''
my_db = MyDb('127.0.0.1', 'python_user', '123123')

'''选择数据库'''
my_db.selectDb('test')


'''修改单条信息
dictData = {'class' : 'DD', 'name' : 'Pitt.C', 'subject' : 'Match_01', 'score' : 60}
condition = [{'class' : 'DD', 'name' : 'Tom'}, 'OR']
print my_db.saveOne('cla_info', dictData, condition)'''

'''删除信息
condition = [{'class':'DD', 'name':'bd', 'id':17}, 'OR']
print my_db.deleteOne('cla_info', condition)'''

'''获取单条信息
fields = ['class', 'name', 'subject', 'score', 'comment']
condition = {'id':6}
print my_db.fetchOne('cla_info', condition, fields)'''

'''新增[单条]
dictData = {'class' : 'DDD', 'name' : 'Pitt', 'subject' : 'Match', 'score' : 97}
in_id = my_db.addOne('cla_info', dictData)
print 'Successful add data: ID(%d)' % in_id'''

'''查询数据
field = ['class', 'name', 'subject', 'score', 'comment']
condition = {'name':'小明'}
ary = my_db.fetchSome('cla_info', condition, field, 1)
if ary or False :
    print 'The total is:',ary[0]
    print ary[1]'''

'''获取总数
condition = {'name':'小明'}
print my_db.getCount('cla_info')'''

'''事务处理'''
my_db.commit()

'''关闭句柄和连接'''

my_db.close()


运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-17549-1-1.html 上篇帖子: mysql均衡负载 下篇帖子: MySQL MyISAM/InnoDB高并发优化经验 数据库
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表