LightMysql:为方便操作MySQL而封装的Python类
原文链接:http://www.danfengcao.info/python/2015/12/26/lightweight-python-mysql-class.html
mysqldb是Python操作MySQL数据库的一个常用包。但在使用过程中,我认为用起来还不够简便。为此,我在mysqldb的基础上封装了一个Python类LightMysql。
先来看如何使用
example.py
#!/usr/bin/env python
# -*- coding: utf-8 -*- from LightMysql import LightMysql if __name__ == '__main__': # 配置信息,其中host, port, user, passwd, db为必需
dbconfig = {'host':'127.0.0.1',
'port': 3306,
'user':'danfengcao',
'passwd':'',
'db':'test',
'charset':'utf8'} db = LightMysql(dbconfig) # 创建LightMysql对象,若连接超时,会自动重连 # 查找(select, show)都使用query()函数
sql_select = "SELECT * FROM Customer"
result_all = db.query(sql_select) # 返回全部数据
result_count = db.query(sql_select, 'count') # 返回有多少行
result_one = db.query(sql_select, 'one') # 返回一行 # 增删改都使用dml()函数
sql_update = "update Customer set Cost=2 where Id=2"
result_update = db.dml(sql_update)
sql_delete = "delete from Customer where Id=2"
result_delete = db.dml(sql_delete) db.close() # 操作结束,关闭对象
使用前需安装
该类依赖于MySQLdb,故需先安装MySQLdb包。
- 使用python包管理器(easy_install或pip)安装
easy_install mysql-python 或 pip install MySQL-python
- 或者手动编译安装
LightMysql完整代码
#!/usr/bin/env python
# -*- coding: utf-8 -*- import MySQLdb
import time, re class LightMysql:
"""Lightweight python class connects to MySQL. """ _dbconfig = None
_cursor = None
_connect = None
_error_code = '' # error_code from MySQLdb TIMEOUT_DEADLINE = 30 # quit connect if beyond 30S
TIMEOUT_THREAD = 10 # threadhold of one connect
TIMEOUT_TOTAL = 0 # total time the connects have waste def __init__(self, dbconfig): try:
self._dbconfig = dbconfig
self.dbconfig_test(dbconfig)
self._connect = MySQLdb.connect(
host=self._dbconfig['host'],
port=self._dbconfig['port'],
user=self._dbconfig['user'],
passwd=self._dbconfig['passwd'],
db=self._dbconfig['db'],
charset=self._dbconfig['charset'],
connect_timeout=self.TIMEOUT_THREAD)
except MySQLdb.Error, e:
self._error_code = e.args[0]
error_msg = "%s --- %s" % (time.strftime('%Y-%m-%d %H:%M:%S',time.localtime(time.time())), type(e).__name__), e.args[0], e.args[1]
print error_msg # reconnect if not reach TIMEOUT_DEADLINE.
if self.TIMEOUT_TOTAL < self.TIMEOUT_DEADLINE:
interval = 0
self.TIMEOUT_TOTAL += (interval + self.TIMEOUT_THREAD)
time.sleep(interval)
return self.__init__(dbconfig)
raise Exception(error_msg) self._cursor = self._connect.cursor(MySQLdb.cursors.DictCursor) def dbconfig_test(self, dbconfig):
flag = True
if type(dbconfig) is not dict:
print 'dbconfig is not dict'
flag = False
else:
for key in ['host','port','user','passwd','db']:
if not dbconfig.has_key(key):
print "dbconfig error: do not have %s" % key
flag = False
if not dbconfig.has_key('charset'):
self._dbconfig['charset'] = 'utf8' if not flag:
raise Exception('Dbconfig Error')
return flag def query(self, sql, ret_type='all'):
try:
self._cursor.execute("SET NAMES utf8")
self._cursor.execute(sql)
if ret_type == 'all':
return self.rows2array(self._cursor.fetchall())
elif ret_type == 'one':
return self._cursor.fetchone()
elif ret_type == 'count':
return self._cursor.rowcount
except MySQLdb.Error, e:
self._error_code = e.args[0]
print "Mysql execute error:",e.args[0],e.args[1]
return False def dml(self, sql):
'''update or delete or insert'''
try:
self._cursor.execute("SET NAMES utf8")
self._cursor.execute(sql)
self._connect.commit()
type = self.dml_type(sql)
# if primary key is auto increase, return inserted ID.
if type == 'insert':
return self._connect.insert_id()
else:
return True
except MySQLdb.Error, e:
self._error_code = e.args[0]
print "Mysql execute error:",e.args[0],e.args[1]
return False def dml_type(self, sql):
re_dml = re.compile('^(?P<dml>\w+)\s+', re.I)
m = re_dml.match(sql)
if m:
if m.group("dml").lower() == 'delete':
return 'delete'
elif m.group("dml").lower() == 'update':
return 'update'
elif m.group("dml").lower() == 'insert':
return 'insert'
print "%s --- Warning: '%s' is not dml." % (time.strftime('%Y-%m-%d %H:%M:%S',time.localtime(time.time())), sql)
return False def rows2array(self, data):
'''transfer tuple to array.'''
result = []
for da in data:
if type(da) is not dict:
raise Exception('Format Error: data is not a dict.')
result.append(da)
return result def __del__(self):
'''free source.'''
try:
self._cursor.close()
self._connect.close()
except:
pass def close(self):
self.__del__()
Reference
LightMysql:为方便操作MySQL而封装的Python类的更多相关文章
- php操作Mysql 以及封装常用的函数 用外连接连接3个表的案例
<?php header("content-type;text/html;charset=utf-8"); //数据库连接define('DB_HOST','localhos ...
- C#连接操作MySQL数据库详细步骤 帮助类等(二次改进版)
最近准备写一个仓库管理的项目 客户要求使用C#编写MySQL存储数据 为了方便,整理了数据库操作的工具类 首先在项目App.config 文件下添加节点 <connectionStrings&g ...
- python中操作excel数据 封装成一个类
本文用python中openpyxl库,封装成excel数据的读写方法 from openpyxl import load_workbook from openpyxl.worksheet.works ...
- paramiko操作详解(封装好的类,可以直接使用)
#!/usr/bin/env python #encoding:utf8 #author: djoker import paramiko class myParamiko: def __init__( ...
- jdbc操作mysql
本文讲述2点: 一. jdbc 操作 MySQL .(封装一个JdbcUtils.java类,实现数据库表的增删改查) 1. 建立数据库连接 Class.forName(DRIVER); connec ...
- python3操作MySQL数据库
安装PyMySQL 下载地址:https://pypi.python.org/pypi/PyMySQL 1.把操作Mysql数据库封装成类,数据库和表先建好 import pymysql.cursor ...
- python 操作 mysql基础补充
前言 本篇的主要内容为整理mysql的基础内容,分享的同时方便日后查阅,同时结合python的学习整理python操作mysql的方法以及python的ORM. 一.数据库初探 在开始mysql之前先 ...
- (转)Python中操作mysql的pymysql模块详解
原文:https://www.cnblogs.com/wt11/p/6141225.html https://shockerli.net/post/python3-pymysql/----Python ...
- python操作mysql基础一
python操作mysql基础一 使用Python操作MySQL的一些基本方法 前奏 为了能操作数据库, 首先我们要有一个数据库, 所以要首先安装Mysql, 然后创建一个测试数据库python_te ...
随机推荐
- 有了jsRender,妈妈再也不用担心我用jq拼接DOM拼接的一团糟了、页面整齐了、其他伙伴读代码也不那么费劲了
写在前面 说来也很巧, 下午再做一个页面,再普通不过的分页列表,我还是像往常一样,基于MVC环境下,我正常用PagedList.MVC AJAX做无刷新分页,这时候问题就来了,列表数据中有个轮播图用到 ...
- OpenCV2:Mat属性type,depth,step
在OpenCV2中Mat类无疑使占据着核心地位的,前段时间初学OpenCV2时对Mat类有了个初步的了解,见OpenCV2:Mat初学.这几天试着用OpenCV2实现了图像缩小的两种算法:基于等间隔采 ...
- css学习--css基础
学习慕课网笔记,课程:http://www.imooc.com/code/2024 1.css选择器 子选择器:parent>child 子选择器是指选择parent的范围内的第一个子元素.这里 ...
- 【原创】kafka client源代码分析
该包下只有一个文件:ClientUtils.scala.它是一个object,里面封装了各种client(包括producer,consumer或admin)可能会用到的方法: 1. fetchTop ...
- 关系数据库SQL之可编程性函数(用户自定义函数)
前言 在关系型数据库中除了前面几篇基本的数据库和数据表操作之外,还提供了可编程性的函数.存储过程.事务.触发器及游标. 本文介绍的是函数. 函数分为两种: 系统函数 用户自定义函数 准备工作 这里以银 ...
- List集合去重的一种方法
前一段时间们需要对一个List<Model>集合去重,情况是该集合中会出现多个Name属性值相同的,但是其他属性值不同的数据. 在这种情况下,需求要只保留其中一个就好. 我觉得遍历和Has ...
- 改进uwsgi启动脚本,使其支持多个独立配置文件
最近在研究flask,在架设运行环境的时候犯了难.因为我想把每个独立的应用像NGINX处理多个网站那样,每个应用单独一个配置文件.而网上流传的uwsgi启动脚本都只支持单个配置文件.虽然有文章说可以把 ...
- python 优矿自动化交易
一.进入官网,打开notebook 自己新建 notebook 二.在代码中编写自己的交易策略 https://uqer.io/help/faqApi/#account相关属性 在帮助文档中可以找到 ...
- 使用NPOI读取Excel到DataTable
一.NPOI介绍: 使用 NPOI 你就可以在没有安装 Office 或者相应环境的机器上对 WORD/EXCEL 文档进行读写.NPOI是构建在POI 3.x版本之上的,它可以在没有安装Office ...
- UDS(ISO14229-2006) 汉译(No.4 术语和缩写)
A_PCI Application layer Protocol Control Information应用层协议控制消息. A_PDU ...