因需要变化需要改造以前的数据库,整理数据库的时候用python写脚本来洗数据,由于刚刚接触python不久,就像网上找个数据库连接池,于是找到了DBUtils,根据网上的代码直接跑了一遍,跑的时候是查询,没什么问题;然后我就开始用到项目上,结果提示插入数据成功,但数据库却没有变化,折腾了很久,最后试试有没有数据库事务,就调用了一个提交的方法,居然有效;由于类中没有注明,莫名奇妙的踩坑了。
代码如下:
# -*- coding: UTF-8 -*-
"""
Created on 2016年5月7日
@author: baocheng
1、执行带参数的SQL时,请先用sql语句指定需要输入的条件列表,然后再用tuple/list进行条件批配
2、在格式SQL中不需要使用引号指定数据类型,系统会根据输入参数自动识别
3、在输入的值中不需要使用转意函数,系统会自动处理
"""
import MySQLdb
from MySQLdb.cursors import DictCursor
from DBUtils.PooledDB import PooledDB
# from PooledDB import PooledDB
import DbConfig
"""
Config是一些数据库的配置文件
"""
class Mysql(object):
"""
MYSQL数据库对象,负责产生数据库连接 , 此类中的连接采用连接池实现获取连接对象:conn = Mysql.getConn()
释放连接对象;conn.close()或del conn
"""
# 连接池对象
__pool = None
def __init__(self):
# 数据库构造函数,从连接池中取出连接,并生成操作游标
self._conn = Mysql.__getConn()
self._cursor = self._conn.cursor()
@staticmethod
def __getConn():
"""
@summary: 静态方法,从连接池中取出连接
@return MySQLdb.connection
"""
if Mysql.__pool is None:
__pool = PooledDB(creator=MySQLdb, mincached=1, maxcached=20,
host=DbConfig.DBHOST, port=DbConfig.DBPORT, user=DbConfig.DBUSER, passwd=DbConfig.DBPWD,
db=DbConfig.DBNAME, use_unicode=False, charset=DbConfig.DBCHAR, cursorclass=DictCursor)
return __pool.connection()
def getAll(self, sql, param=None):
"""
@summary: 执行查询,并取出所有结果集
@param sql:查询SQL,如果有查询条件,请只指定条件列表,并将条件值使用参数[param]传递进来
@param param: 可选参数,条件列表值(元组/列表)
@return: result list(字典对象)/boolean 查询到的结果集
"""
if param is None:
count = self._cursor.execute(sql)
else:
count = self._cursor.execute(sql, param)
if count > 0:
result = self._cursor.fetchall()
else:
result = False
return result
def getOne(self, sql, param=None):
"""
@summary: 执行查询,并取出第一条
@param sql:查询SQL,如果有查询条件,请只指定条件列表,并将条件值使用参数[param]传递进来
@param param: 可选参数,条件列表值(元组/列表)
@return: result list/boolean 查询到的结果集
"""
if param is None:
count = self._cursor.execute(sql)
else:
count = self._cursor.execute(sql, param)
if count > 0:
result = self._cursor.fetchone()
else:
result = False
return result
def getMany(self, sql, num, param=None):
"""
@summary: 执行查询,并取出num条结果
@param sql:查询SQL,如果有查询条件,请只指定条件列表,并将条件值使用参数[param]传递进来
@param num:取得的结果条数
@param param: 可选参数,条件列表值(元组/列表)
@return: result list/boolean 查询到的结果集
"""
if param is None:
count = self._cursor.execute(sql)
else:
count = self._cursor.execute(sql, param)
if count > 0:
result = self._cursor.fetchmany(num)
else:
result = False
return result
def insertOne(self, sql, value):
"""
@summary: 向数据表插入一条记录
@param sql:要插入的SQL格式
@param value:要插入的记录数据tuple/list
@return: insertId 受影响的行数
"""
self._cursor.execute(sql, value)
return self.__getInsertId()
def insertMany(self, sql, values):
"""
@summary: 向数据表插入多条记录
@param sql:要插入的SQL格式
@param values:要插入的记录数据tuple(tuple)/list[list]
@return: count 受影响的行数
"""
count = self._cursor.executemany(sql, values)
return count
def __getInsertId(self):
"""
获取当前连接最后一次插入操作生成的id,如果没有则为0
"""
self._cursor.execute("SELECT @@IDENTITY AS id")
result = self._cursor.fetchall()
return result[0]['id']
def __query(self, sql, param=None):
if param is None:
count = self._cursor.execute(sql)
else:
count = self._cursor.execute(sql, param)
return count
def update(self, sql, param=None):
"""
@summary: 更新数据表记录
@param sql: SQL格式及条件,使用(%s,%s)
@param param: 要更新的 值 tuple/list
@return: count 受影响的行数
"""
return self.__query(sql, param)
def delete(self, sql, param=None):
"""
@summary: 删除数据表记录
@param sql: SQL格式及条件,使用(%s,%s)
@param param: 要删除的条件 值 tuple/list
@return: count 受影响的行数
"""
return self.__query(sql, param)
def begin(self):
"""
@summary: 开启事务
"""
self._conn.autocommit(0)
def end(self, option='commit'):
"""
@summary: 结束事务
"""
if option == 'commit':
self._conn.commit()
else:
self._conn.rollback()
def dispose(self, isEnd=1):
"""
@summary: 释放连接池资源
"""
if isEnd == 1:
self.end('commit')
else:
self.end('rollback');
self._cursor.close()
self._conn.close()
数据库配置文件 DbConfig
# coding:utf-8
'''
Created on 2016年5月7日
@author: baocheng
'''
DBHOST = "192.168.2.200"
DBPORT = 3306
DBUSER = "test"
DBPWD = "test"
DBNAME = "test"
DBCHAR = "utf8"
测试代码
# coding:utf-8
'''
@author: baocheng
'''
from MySqlConn import Mysql
from _sqlite3 import Row
# 申请资源
mysql = Mysql()
sqlAll = "select userid,name from t_user order by userid desc limit 11"
result = mysql.getAll(sqlAll)
if result:
print "get all"
for row in result:
print "%s\t%s" % (row["userid"], row["name"])
"""insert """
#占位符用%s
sqlSave = "INSERT INTO t_test(userid)' values(%s) "
'''参数使用tuple或list'''
data = ['11111111']
'''执行插入操作'''
mysql.insertOne(sqlSave,data)
'''commit 操作,并关闭连接池'''
mysql.dispose()
参考博客:http://blog.csdn.net/zbc1090549839/article/details/51336458