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的更多相关文章

  1. python 使用pymssql连接sql server数据库

    python 使用pymssql连接sql server数据库   #coding=utf-8 #!/usr/bin/env python#------------------------------ ...

  2. Azure SQL Database (20) 使用SQL Server 2016 Upgrade Advisor

    <Windows Azure Platform 系列文章目录>  Azure SQL Database (19) Stretch Database 概览      Azure SQL Da ...

  3. [转]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/ ...

  4. 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 ...

  5. 使用 Python 在 Caché 和 Sql Server 之间同步数据

    任务目标:抽取 Caché 中的数据,导入 Sql Server 中. 遇到的问题: 1.UnicodeEncodeError: ‘ascii’ codec can’t encode characte ...

  6. python使用pyodbc连接sql server 2008

    一.PyODBC的下载地址: http://code.google.com/p/pyodbc/ 二.测试语句 import pyodbccnxn = pyodbc.connect(DRIVER='{S ...

  7. 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- ...

  8. python 使用pymssql连接sql server数据库(转)

    import pymssql class MSSQL:    """    对pymssql的简单封装    pymssql库,该库到这里下载:http://www.lf ...

  9. Python连接不上SQL Server的两种根治思路

    连接不上数据库,首先可以排除是代码的问题,连接方式都是千篇一律的. 大多数问题都是本机的两个原因造成的,1.服务没有开启,2.没有启动SQL配置的TCP/IP 下面给出统一解决方案: 首先从开始菜单找 ...

随机推荐

  1. XML文档读取-DOM

    DOM(Document Object Model),“文档对象模型”早期是为了解决不用浏览器间数据兼容问题提出的解决方案,现在已经是W3C组织推荐的处理可扩展标志语言的标准编程接口. W3C DOM ...

  2. 基于MATLAB的人脸识别算法的研究

    基于MATLAB的人脸识别算法的研究 作者:lee神 现如今机器视觉越来越盛行,从智能交通系统的车辆识别,车牌识别到交通标牌的识别:从智能手机的人脸识别的性别识别:如今无人驾驶汽车更是应用了大量的机器 ...

  3. 对于是否在一个python程序中编写函数的启发

    那我们到底是应该直接使用这些模块级别的函数呢,还是先编译一个模式对象,再调用模式对象的方法呢?这其实取决于正则表达式的使用频率,如果说我们这个程序只是偶尔使用到正则表达式,那么全局函数是比较方便的:如 ...

  4. java注解(转并做修改)

    本文由 ImportNew - 人晓 翻译自 idlebrains.欢迎加入翻译小组.转载请见文末要求. 自Java5.0版本引入注解之后,它就成为了Java平台中非常重要的一部分.开发过程中,我们也 ...

  5. 关于flask登录视图报错AttributeError: '_AppCtxGlobals' object has no attribute 'user'

    在一个小程序中写了一个登录视图函数,代码如下: @app.route('/login',methods = ['GET','POST']) @oid.loginhandler def login(): ...

  6. 控制反转-Ioc之Unity

    本篇幅主要介绍控制反转的一些概念,和如何使用Unity实现Ioc.在介绍的时候,会尽量结合代码来讲解一些概念. 1.什么是DI? DI即控制反转,是将对具体实现类的依赖转变为对接口的依赖,这样在编程中 ...

  7. iOS手势冲突问题

    今天在做一个效果的时候,由于子视图和父视图都有响应的事件,子视图的事件理所当然被父视图拦截掉了,接下来就做分析解决 1.  tableviewcell可以触发点击,同时tableview的父视图有点击 ...

  8. 解决IOS iframe不滚动问题

    .frameBox{ position: fixed; top: 0; left: 0; right: 0; bottom: 0; -webkit-overflow-scrolling: touch; ...

  9. 关于mysql的loose index scan的几点疑问

    本文同时发表在https://github.com/zhangyachen/zhangyachen.github.io/issues/102 关于MySQL的loose index scan有几点疑问 ...

  10. PipeHttp 测试工具使用

      以下简单介绍下参数工具的使用     GitHub地址: https://github.com/lulianqi/PipeHttp/ (工程地址) https://github.com/lulia ...