今天本想测试用python连接到公司SQLSERVER2008上,上网百度了很多,一开始只能连接本地服务器,远程操作还是不行。经过几番折腾,终于找到了方法(通过建立系统数据源的方式实现),特将方法及过程展示出来,以避免后来人少走弯路。
为了在一个CLASS中实现普通连接及数据源连接,我在初始化方法中添加了可变参数(*)及关键字参数(**)。
通过查看pyodbc官方文档,提示说SQL SERVER 设置不赞成,为了兼容后期server版本,我还是使用了“ODBC Driver 13 for SQL Server”。
注意:ODBC Driver 13 for SQL Server如果本机没有安装的请先下载安装,地址:https://www.microsoft.com/en-us/download/details.aspx?id=50420。注意选择对应机型(64位或32位)

一、普通连接(貌似只能本地连接,如果不对请赐教,也就是SERVER=192.168.0.X不起作用)
这个百度就出来很多文章,这里就不多赘述,可以看下边的源代码。
二、DSN方式连接
DSN设置请参考此文章:http://blog.sina.com.cn/s/blog_780cd4880101r5lg.html
设置好DSN,请记住名称及用户名及密码。后边连接参数需要。
三、代码(两种连接通用方式)
import pyodbc
class ODBC_MS():
''''对pyodbc库的操作进行简单封装
pyodbc库的下载地址:http://code.google.com/p/pyodbc/downloads/list
使用该库时,需要在Sql Server Configuration Manager里面将TCP/IP协议开启
此类完成对数据库DB的连接/查询/执行操作
'''
def __init__(self, UID, PWD,*SERVERS,**DSN):
'''initialization '''
self.SERVERS=SERVERS
self.UID = UID
self.PWD = PWD
self.DSN=DSN
#普通连接
def __GetConnect(self):
''''' Connect to the DB '''
if not self.SERVERS:
print("no setting db info")
self.conn=pyodbc.connect('DRIVER=%s;SERVER=%s;DATABASE=%s;UID=%s;PWD=%s'
% (self.SERVERS[0],self.SERVERS[1],self.SERVERS[2],self.UID,self.PWD))
cur = self.conn.cursor()
if not cur:
print("connected failed!")
else:
return cur
#DSN方式连接
def __GetDsnConnect(self):
''''' Connect to the DB '''
if not self.DSN:
print("没有数据源")
self.conn= pyodbc.connect(r'DSN=%s;UID=%s;PWD=%s' % (self.DSN['DSN'],self.UID,self.PWD))
cur = self.conn.cursor()
if not cur:
print("connected failed!")
else:
return cur
def ExecQuery(self, sql):
''''' Perform one Sql statement '''
cur = self.__GetConnect() #建立链接并创建数据库操作指针
cur.execute(sql)#通过指针来执行sql指令
if not cur:
print("connected failed!")
ret = cur.fetchall()#通过指针来获取sql指令响应数据
cur.close()#游标指标关闭
self.conn.close()#关闭数据库连接
return ret
def ExecQuery_Sdn(self, sql):
''''' Perform one Sql statement '''
cur = self.__GetDsnConnect() #建立链接并创建数据库操作指针
cur.execute(sql)#通过指针来执行sql指令
if not cur:
print("connected failed!")
ret = cur.fetchall()#通过指针来获取sql指令响应数据
cur.close()#游标指标关闭
self.conn.close()#关闭数据库连接
return ret
def ExecNoQuery(self,sql):
''''' Person one Sql statement like write data, or create table, database and so on'''
cur = self.__GetConnect()
cur.execute(sql)
self.conn.commit()#连接句柄来提交
cur.close()
self.conn.close()
def ExecNoQuery_Sdn(self,sql):
''''' Person one Sql statement like write data, or create table, database and so on'''
cur = self.__GetDsnConnect()
cur.execute(sql)
self.conn.commit()#连接句柄来提交
cur.close()
self.conn.close()
def main():
sql='select top 10 customer_name from customer'
ms = ODBC_MS('user_name', 'password',DSN='datacentor')
results=ms.ExecQuery_Sdn(sql)
#ms = ODBC_MS('user_name', 'password','{ODBC Driver 13 for SQL Server}', r'localhost', 'test')
#results=ms.ExecQuery(sql)
for row in results:
print(row)
if __name__ == '__main__':
main()