linux 使用 pyodbc 访问 ms sqlserver 数据库

时间:2022-10-13 05:54:15

一.安装linux下Sqlserver的驱动程序:

我们先来安装SqlServer的驱动程序,再安装ODBC相关的,目的是想尽快可以进行测试,因为在安装完Freetds之后,我们马上就可以在linux下连上SqlServer了。

安装Freetds,不要使用apt-get install 来安装,因为源里的版本不一定是新的,建议版本是0.82版,下载源码手工编译安装,因为有好些参数需要在编译中指定的。

1、使用命令行,切换到解压后freetds的目录下面,执行以下命令

./configure \
--prefix=/etc/freetds \
--with-tdsver=8.0
--enable-msdblib \
--enable-dbmfix \
--with-gnu-ld \
--enable-shared \
--enable-static

2、sudo make

3、sudo make install

好了。如果不出意外,freetds已经安装好了。再安装一个小工具freetds-bin,用来测试一下连接你的数据库:

apt-get freetds-bin

安装完毕后,可以使用tsql命令来进行测试SqlServer数据库连接:

# tsql -H 192.168.0.204 -p 1433 -U sa
Password:
locale is "en_US.UTF-8"
locale charset is "UTF-8"
1>
注:如果出现下列错误
locale is "en_US.UTF-8"
locale charset is "UTF-8"
using default charset "UTF-8"
Error 20017 (severity 9):
Unexpected EOF from the server
OS error 115, "Operation now in progress"
Error 20002 (severity 9):
Adaptive Server connection failed
There was a problem connecting to the server
可能和版本有关系请使用下列方式连接:
# TDSVER=8.0 tsql -H 10.88.51.167 -p 1433 -U sa

二.安装linux下的ODBC驱动管理程序:

现在安装unixODBC,让linux下的应用程序可以通过ODBC来访问数据源。我们需要分别安装unixodbc,unixodbc-dev,unixodbc-bin(可选),tdsodbc

apt-get install unixodbc unixodbc-dev unixodbc-bin tdsodbc

前 面讲过了,ODBC驱动管理器会管理数据库驱动和数据源,那么它是如何管理的呢?答案是配置文件,分别有数据库驱动的配置文件和数据源的配置文件,分别是 odbcinst.ini和odbc.ini,其所在的位置可能会因操作系统和安装方式而异,不过可以使用odbcinst -j命令来查看:

root@ubuntu:/home/jeff# odbcinst -j
unixODBC 2.2.11
DRIVERS............: /etc/odbcinst.ini
SYSTEM DATA SOURCES: /etc/odbc.ini
USER DATA SOURCES..: /root/.odbc.ini

在输出的结果中看到数据库驱动的配置文件是/etc/odbcinst.ini、数据源配置是/etc/odbc.ini和/root/odbc.ini。我们可以打开这两个文件看看,是没有内容D。现在我们要做的就是配置数据驱动以及数据源。

三、修改odbc配置:

vi /etc/odbcinst.ini

添加FreeTDS驱动:

[SQL Server]

Description = FreeTDS ODBC driver for MSSQL

Driver = /usr/lib/libtdsodbc.so

Setup = /usr/lib/libtdsS.so

FileUsage = 1

四、连接数据库:

# -*- coding: utf-8 -*-
import pyodbc db = pyodbc.connect('DRIVER={SQL Server};Server=10.88.51.167,1433;DATABASE=tempdb;UID=sa;PWD=sa_DnMirr12;TDS_Version=8.0')
cursor = db.cursor()
recSet = cursor.execute('select top 10 name from sys.objects').fetchall()
for recOne in recSet:
print(recOne.name)
cursor.close()
db.close()
1.一定要记得加上TDS_Version,否则会找不到数据源,或者修改配置文件中的 TDS 的默认版本号。

2.当导入 pyodbc 报目录权限错误时,导入部分可以修改为
# -*- coding: utf-8 -*-
import os
os.environ['PYTHON_EGG_CACHE'] = '/tmp/'
import pyodbc 3.当连接SQLServer取回汉字乱码时,连接数据库时增加参数 unicode_results=True ,返回值进行 utf-8 解码
db = pyodbc.connect('DRIVER={SQL Server};Server=10.88.51.167,1433;DATABASE=tempdb;UID=sa;PWD=sa_DnMirr12;TDS_Version=8.0',unicode_results=True)
cursor = db.cursor()
recSet = cursor.execute('select top 10 name from sys.objects').fetchall()
for recOne in recSet:
print(str(recOne.name).decode('utf-8', 'ignore'))
cursor.close()
db.close()

参考文档:

http://www.jeffkit.info/2010/01/476/

http://www.cnblogs.com/trams/archive/2011/12/02/2272079.html