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 ...
随机推荐
- 在Visual Studio 2012中使用VMSDK开发领域特定语言(二)
本文为<在Visual Studio 2012中使用VMSDK开发领域特定语言>专题文章的第二部分,在这部分内容中,将以实际应用为例,介绍开发DSL的主要步骤,包括设计.定制.调试.发布以 ...
- 【十大经典数据挖掘算法】Apriori
[十大经典数据挖掘算法]系列 C4.5 K-Means SVM Apriori EM PageRank AdaBoost kNN Naïve Bayes CART 1. 关联分析 关联分析是一类非常有 ...
- MVC学习系列13--验证系列之Remote Validation
大多数的开发者,可能会遇到这样的情况:当我们在创建用户之前,有必要去检查是否数据库中已经存在相同名字的用户.换句话说就是,我们要确保程序中,只有一个唯一的用户名,不能有重复的.相信大多数人都有不同的解 ...
- 在Winform程序中设置管理员权限及为用户组添加写入权限
在我们一些Winform程序中,往往需要具有一些特殊的权限才能操作系统文件,我们可以设置运行程序具有管理员权限或者设置运行程序的目录具有写入的权限,如果是在操作系统里面,我们可以设置运行程序以管理员身 ...
- 一句jQuery代码返回顶部
一句jQuery代码返回顶部 效果体验: http://hovertree.com/texiao/yestop/ 使用方法: 只需引用jQuery库和YesTop插件,然后一句代码就可以实现返回顶部: ...
- C#获取IP和整数IP方法
体验: http://tool.hovertree.com/info/ip/代码如下: using System; using System.Text; using System.Text.Regul ...
- button 按钮,结合onclick事件,验证和提交表单
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...
- 【Java每日一题】20161212
package Dec2016; public class Ques1212 { public static void main(String[] args){ System.out.println( ...
- java for循环冒泡排序
int[]a =new int[]{7,19,66,21,88,40}; for(int i=1;i<=a.length-1;i++){ //比总长度减1趟就排好序了.因为每一趟出一个值. fo ...
- nginx concat模块配置 页面返回400 bad request
在1.4.x版本的nginx没有发现这个问题,但是在1.5.x版本就遇到了这个问题 由于Nginx在新版本中,使用了标准的 MIME-Type:application/javascript.而在ngi ...