python Database Poll for SQL SERVER
python连接SQL SERVER数据库:
Python编程中可以使用SQL SERVER 进行数据库的连接及诸如查询/插入/更新等操作,但是每次连接SQL SERVER 数据库请求时,都是独立的去请求访问,相当浪费资源,而且访问数量达到一定数量时,对SQL SERVER 的性能会产生较大的影响。因此,实际使用中,通常会使用数据库的连接池技术,来访问数据库达到资源复用的目的。
python的数据库连接池包 DBUtils:
DBUtils是一套Python数据库连接池包,并允许对非线程安全的数据库接口进行线程安全包装。DBUtils来自Webware for Python。
DBUtils提供两种外部接口:
- * PersistentDB :提供线程专用的数据库连接,并自动管理连接。
- * PooledDB :提供线程间可共享的数据库连接,并自动管理连接。
需要的python库:
下载DBUtils:
Webware 的网站下载最新版本:http://www.webwareforpython.org/downloads/DBUtils/
或者在Python Package Index来下载:http://www.python.org/pypi/DBUtils/
下载pymssql:
http://code.google.com/p/pymssql/downloads/list
(pymssql 是Python语言用来连接微软 SQL SERVER 数据库的类库)
1.写一个创建连接池,获取连接以及重新连接数据库的模块:
# libby_db_pool.py
# 代码如下:
#-*- coding:utf-8 -*-
from DBUtils.PooledDB import PooledDB
import pymssql #sqlserver数据库适配器 from pymssql import OperationalError, InternalError, ProgrammingError HOST = "127.0.0.1"
PORT = "1433"
CHARSET = "utf8"
NAME = "zkeco_oracle"
USER = "sa"
PASSWORK = "sa" conn_args = {
'host':"%s"%HOST,
'port':"%s"%PORT,
'database':"%s"%NAME,
'charset':"%s"%CHARSET,
'user':"%s"%USER,
'password':"%s"%PASSWORK
} """
mincached : 启动时开启的闲置连接数量(默认值 0,意味着开始时不创建数据库连接)
maxcached : 连接池中允许的闲置的最多连接数量(缺省值 0 代表不闲置连接池大小,对于线程安全的数据库,这个不起作用)
maxshared : 共享连接数允许的最大数量(默认值 0 代表所有连接都是专用的)如果达到了最大数量,被请求为共享的连接将会被共享使用
maxconnecyions : 创建连接池的最大数量(缺省值 0 代表不限制)
blocking : 设置在连接池达到最大数量时的行为(缺省值 0 或 False 代表返回一个错误<toMany......>; 其他代表阻塞直到连接数减少,连接被分配)
maxusage : 单个连接的最大允许复用次数(缺省值 0 或 False 代表不限制的复用).当达到最大数时,连接会自动重新连接(关闭和重新打开)
setsession : 一个可选的SQL命令列表用于准备每个会话,如["set datestyle to german", ...] """ args = (10,10,30,100,True,0,None) class DbManager():
def __init__(self):
try:
self._pool = PooledDB(pymssql,*args,**conn_args)
except Exception,e:
print "The parameters for DBUtils is:",conn_args
def _getConn(self):
return self._pool.connection() _dbManager = DbManager() def getConn():
""" 获取数据库连接 """
return _dbManager._getConn() def _reConn():
""" 重新连接数据库 """
global _dbManager
re = False
try:
_dbManager = DbManager()
re = True
except:
import traceback
traceback.print_exc()
finally:
return re
import datetime def reConn():
print "%s: now try to reconnect Database!"%(datatime.datatime.now())
flag = _reConn()
if flag:
print "%s reconnect database success!"%(datatime.datatime.now())
else:
print "%s reconnect database failed!"%(datatime.datatime.now())
2.写一个支持增删查改功能的连接池模块:
#libby_sql_utils.py
#代码如下: #-*- coding:utf-8 -*-
from libby_db_pool import getConn,reConn
from libby_db_pool import OperationalError, InternalError, ProgrammingError
import traceback
def test_conn():
"""
测试连接池连接是否正常
return:
res:True:正常,False:不正常
msg:如果不正常,为异常信息
""" test_sql = """
select 1 """ conn = None
cur = None
res = False
msg = ""
try:
conn = getConn()
cur = conn.cursor()
cur.execute(test_sql)
res = cur.fetchall()
res = True
except Exception,e:
trackback.print_exc()
msg = e
finally:
if cur:
cur.close()
if conn:
conn.close()
return res,msg def call_reConn():
"""
重新创建连接池
"""
reConn() def p_query(sql):
"""
dbutils 数据连接池
只能执行数据查询sql语句,否则会抛错
@parm: 要执行的sql语句
@return:
[]:查询结果为空
None:sql语句执行失败,出现异常
二维list:正常结果
""" conn = None
cur = None
res = None
try:
conn = getConn()
cur = conn.cursor()
cur.execute(sql)
res = cur.fetchall()
except (OperationalError, InternalError):
call_reConn()
trackback.print_exc()
except:
trackback.exc()
finally:
if cur:
cur.close()
if conn:
conn.close()
return res def p_query_one(sql):
"""
dbutils 数据连接池
只能执行数据查询sql语句,否则会报错
执行sql查询语句,获取第一条记录
@parm:要执行的sql语句
@return:
[]:查询结果为空
None:sql语句执行失败,出现异常
list:正常结果
""" conn = None
cur = None
res = None
try:
conn = getConn()
cur = conn.cursor()
cur.execute(sql)
res = cur.fetchone()
except (OperationalError,InternalError):
call_reConn()
except:
traceback.print_exc()
finally:
if cur:
cur.close()
if conn:
conn.close()
return res def p_execute(sql):
"""
dbutils 数据连接池
执行数据操作语句,包括 update,insert,delete
@parm:要执行的sql
@return:
None:sql语句执行失败,出现异常
number:影响记录条数
-2:数据库连接失败导致执行失败
"""
conn = None
cur = None
res = None
try:
conn = getConn()
cur = conn.cursor()
cur.execute(sql)
res = cur._cursor.rowcount
conn.commit()
except Exception,e:
if conn:
conn.rollback()
traceback.print_exc()
finally:
if res == -1:#可能是数据库断开连接
ret,msg = test_conn()
if not ret:
call_reConn()
res = -2
if cur:
cur.close()
if conn:
conn.close()
return res def p_mutiexec(sql_list):
"""
dbutils 数据连接池
执行多条数据操作语句,可以用于多条sql语句的事务性操作,包括 update,insert,delete @parm:要执行的sql语句[]
@return:
(flag,res):
flag<Ture or False>:批次是否全部执行成功
res<list>:每天sql语句执行影响的行数,如果执行失败,由此可以判断第几条sql语句执行失败
如果遇到数据库断开的情况,返回[-2,] """ conn = None
cur = None
res = []
flag = True try:
conn = getConn()
cur = conn.cursor()
for sql in sql_list:
cur.execute(sql)
num = cur._cursor.rowcount
res.append(num)
conn.commit()
except Exception,e:
if conn:
conn.rollback()
traceback.print_exc()
finally:
if -1 in res:
ret,msg = test_conn()
if not ret:
call_reConn()
flag = False
res = [-2,]
if cur:
cur.close()
if conn:
conn.close()
return flag,res
python Database Poll for SQL SERVER的更多相关文章
- python 使用pymssql连接sql server数据库
python 使用pymssql连接sql server数据库 #coding=utf-8 #!/usr/bin/env python#------------------------------ ...
- Azure SQL Database (20) 使用SQL Server 2016 Upgrade Advisor
<Windows Azure Platform 系列文章目录> Azure SQL Database (19) Stretch Database 概览 Azure SQL Da ...
- [转]SQL SERVER – Importance of Database Schemas in SQL Server
原文地址http://blog.sqlauthority.com/2009/09/07/sql-server-importance-of-database-schemas-in-sql-server/ ...
- Importing/Indexing database (MySQL or SQL Server) in Solr using Data Import Handler--转载
原文地址:https://gist.github.com/maxivak/3e3ee1fca32f3949f052 Install Solr download and install Solr fro ...
- 使用 Python 在 Caché 和 Sql Server 之间同步数据
任务目标:抽取 Caché 中的数据,导入 Sql Server 中. 遇到的问题: 1.UnicodeEncodeError: ‘ascii’ codec can’t encode characte ...
- python使用pyodbc连接sql server 2008
一.PyODBC的下载地址: http://code.google.com/p/pyodbc/ 二.测试语句 import pyodbccnxn = pyodbc.connect(DRIVER='{S ...
- Easy way to change collation of all database objects in SQL Server
This info is from: http://www.codeproject.com/Articles/302405/The-Easy-way-of-changing-Collation-of- ...
- python 使用pymssql连接sql server数据库(转)
import pymssql class MSSQL: """ 对pymssql的简单封装 pymssql库,该库到这里下载:http://www.lf ...
- Python连接不上SQL Server的两种根治思路
连接不上数据库,首先可以排除是代码的问题,连接方式都是千篇一律的. 大多数问题都是本机的两个原因造成的,1.服务没有开启,2.没有启动SQL配置的TCP/IP 下面给出统一解决方案: 首先从开始菜单找 ...
随机推荐
- check the manual that corresponds to your MySQL server version for the right syntax处理方案
check the manual that corresponds to your MySQL server version for the right syntax:代码出现这样的bug,就要注意你 ...
- java 对象的初始化过程
PersonDemo p=new PersonDemo("lisi",20);这句话都做了什么事情? 因为new用到了PersonDemo.class,所以会先找到PersonDe ...
- 《HelloGitHub》第 21 期
公告 元旦快乐! <HelloGitHub>第 21 期 兴趣是最好的老师,HelloGitHub 就是帮你找到兴趣! 简介 分享 GitHub 上有趣.入门级的开源项目. 这是一个面向编 ...
- mac配置java和maven环境变量
1.打开终端: 2.输入命令:sudo vi ~/.bash_profile进入编辑模式: 3.输入开机密码并按两次enter键进入编辑选择项: 4.输入i键进入文件插入模式输入配置信息: 5.按es ...
- 599. Minimum Index Sum of Two Lists
Suppose Andy and Doris want to choose a restaurant for dinner, and they both have a list of favorite ...
- 二分查找(折半查找)C++
二分查找又称折半查找,优点是比较次数少,查找速度快,平均性能好,占用系统内存较少: 其缺点是要求待查表为有序表,且插入删除困难. 因此,折半查找方法适用于不经常变动而查找频繁的有序列表. 首先,假设表 ...
- 入门级Nginx反向代理nodejs
本着想实现前后端分离开发的初衷,我决定学习一下关于nignx反向代理的配置. 1.下载Nginx稳定版本 2.打开nginx配置文件 nginx.conf: 3.在http模块的server部分配置 ...
- 学习 Kubernetes 的 Why 和 How - 每天5分钟玩转 Docker 容器技术(114)
这是一个系统学习 Kubernetes 的教程,有下面两个特点: 系统讲解当前最流行的容器编排引擎 Kubernetes包括了安装部署.应用管理.网络.存储.监控.日志管理等多各个方面. 重实践并兼顾 ...
- 设计模式之 - 模板模式(Template Pattern)
引入:这几天在看一本讲spring源码的书<SPRING技术内幕>里面在讲加载配置文件的时候,可以有不同的加载方式,如根据文件系统目录加载配置文件(FileSystemXmlApplica ...
- 【深度学习系列】一起来参加百度 PaddlePaddle AI 大赛吧!
写这个系列写了两个月了,对paddlepaddle的使用和越来越熟悉,不过一直没找到合适的应用场景.最近百度搞了个AI大赛,据说有四个赛题,现在是第一个----综艺节目精彩片段预测 ,大家可以去检测一 ...