这个问题看似简单,网上找了N多资料,都是不行的。
今晚终于解决,途径如下:
----特别说明一下,我这边手头上只有一台32位的系统,没有64位的,如果各位版本不一样,下载软件的时候相应要变更一下版本(尤其163源)
0. 系统环境:
CentOS6.5 32bit(Linux version 2.6.32-71.el6.i686)
Python2.6.6 --升级到--> python2.7.11 (两个版本共存,因为yum依赖2.6.6版本,扯淡地与2.7不兼容)
unixODBC-2.2.14-14.el6.i686
freetds-0.91
pyodbc-3.0.10
1. 安装unixODBC
yum install unixODBC
# 一般情况下是能安装的,如果没有网络,或者不能直接通过yum下载安装,那么就上163的开源镜像站下载rpm包后安装:
# http://mirrors.163.com/centos/6.7/os/i386/Packages/unixODBC-2.2.14-14.el6.i686.rpm
# http://mirrors.163.com/centos/6.7/os/i386/Packages/unixODBC-devel-2.2.14-14.el6.i686.rpm
# http://mirrors.163.com/centos/6.7/os/i386/Packages/unixODBC-kde-2.2.14-14.el6.i686.rpm
# 参考如下命令:
# rpm -ivh unixODBC-2.2.14-14.el6.i686.rpm
2. 安装freetds
# 这里首先遇到一个坑,网上一直流转一篇转载无数遍的文章,说安装是用yum的:yum install freetds
# 但这是第三方工具包啊,怎么可能直接yum得到呢?除非你加了第三方的源,但是正常人都不会这么扯淡地。
# 扯远了,安装方法如下:
# wget http://ibiblio.org/pub/Linux/ALPHA/freetds/stable/freetds-stable.tgz
# tar zxvf freetds-stable.tgz
# freetds-0.91 #我当前的版本是0.91,后面可能会更新成更高的版本,对应改一下。
# ./configure --prefix=/usr/local/freetds0.91 --enable-msdblib --with-tdsver=8.0 //目前最高好像只支持到7.1,但可写到8.0,可用 configure--help 查看
# 这两个参数稍微讲解一下,8.0那个版本我就不说了,enable-msdblib是指开启对MSSQL的支持
# make
# make install
# make clean
# make distclean
3. 安装pyodbc
# pip install pyodbc
# 正常来讲捏,这样就能装了,但是如果你用的minimal的系统,那么可能需要先安装一下c++编译器:yum install gcc-c++
# 同理,如果没有办法联网,gcc-c++在163源上可以帮助你:http://mirrors.163.com/centos/6.7/os/i386/Packages/gcc-c%2b%2b-4.4.7-16.el6.i686.rpm
# 而pyodbc也可以在官网下载:https://pypi.python.org/pypi/pyodbc/3.0.10(linux 的话,就下载type=source的那个吧)
# 安装方法很简单,先解压,然后 python setup.py install
4. 以上确认都安装好了之后就进行配置的步骤了:
1) freetds: 这是连接数据库的基础,必须先配置好
# 添加数据库配置
# cp /usr/local/freetds0.91/etc/freetds.conf /usr/local/freetds0.91/etc/freetds.conf.20160102
# cat >> /usr/local/freetds0.91/etc/freetds.conf
[TestDB]
host = 192.168.1.100
port = 1433
tds version = 8.0^C #就是 ctrl+c ^_^ #你别把这一行也复制进去了啊
# 这里说明一下,网上流传的配置是有4项的,除了host、post、tds version外,还有一个 client charset = UTF-8
# 这里可是真要留意一下,不能随便配置最后这个参数,传说必须要比服务端的配置高等级才行,反正我只要是配置上了,就无法连接了,所以我没有配这个参数。
# 配置好之后可以用freetds自带的工具测试一下:
# /usr/local/freetds0.91/bin/tsql -S TestDB -U DBUserName -P DBPassword
# 如果显示如下,则表示ok;不行,则请回到上面配置的步骤:
locale is "zh_CN.UTF-8"
locale charset is "UTF-8"
using default charset "UTF-8"
1> select getdate()
2> go1月 2 2016 11:44:49:497(1 row affected)
1># 1> 2> 后面的内容是我输入的喔,当然你也可以select * from DBName.dbo.TableName查询,记得加上go
2) 配置ODBC:这是pyodbc连接的关键。
#先找一下你系统里面这两个文件放哪里:libtdsodbc.so、libtdsS.so:
# find /usr -name "*\.so" |egrep "libtdsodbc|libtdsS"
/usr/lib/libtdsS.so
/usr/local/freetds0.91/lib/libtdsodbc.so# 配置
# cp /etc/odbcinst.ini /etc/odbcinst.ini.20160102
# cat >> /etc/odbcinst.ini
[SQL Server]
Description = FreeTDS ODBC driver for MSSQL
Driver = /usr/local/freetds0.91/lib/libtdsodbc.so
Setup = /usr/lib/libtdsS.so
FileUsage = 1^C #你别把这一行也复制进去了啊
# 检查一下,默认情况下,应该是有三行,最后那行就是刚刚添加的驱动名称了
# odbcinst -d -q
[PostgreSQL]
[MySQL]
[SQL Server]# 配置DSN(此步骤非必要,如果要使用isql,就需要配置,否则,如果只使用pyodbc,可以不配置)
# 配置方式有两种:
# 1. 全局DSN:
# cat >> /etc/odbc.ini
# 2. 用户级DSN:
# cat >> ~/.odbc.ini
# 内容都是:
[TESTDSN]
Driver = SQL Server
Server = 192.168.1.100
User = DBUserName
TDS_Version = 8.0
Port = 1433# 可能会冲突,建议还是配置用户级就好了。
# 检查DSN:odbcinst -q -s
# 测试DSN:isql TESTDSN DBUserName DBPassword
3) 测试pyodbc:
>>> import pyodbc
>>> DBCONNECTSTR = 'DRIVER={SQL Server};SERVER=192.168.1.100;port=1433;DATABASE=DBNAME;UID=DBUSER;PWD=DBPASS;TDS_Version=8.0;'
>>> conn=pyodbc.connect(DBCONNECTSTR)
>>> conn.execute('select getdate()').fetchall()
>>> conn.close()>>> [(datetime.datetime(2016, 1, 3, 0, 18, 48, 207000), )]
# 这里特别备注一下,留意第二行的红色字眼,这里坑了我无数遍,我简直连问候父母的心都有了。
# 几乎所有资料都没有这个配置,但是缺了这个配置,就会报错:(感谢参考资料2的作者)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
pyodbc.Error: ('08001', '[08001] [unixODBC][FreeTDS][SQL Server]Unable to connect to data source (0) (SQLDriverConnect)')# 这个鸟问题,可是搞了我几个晚上。
----------------------------------
参考文献:
1. Centos+PHP5.3.6+Freetds0.9.1安装并配制mssql(2008)支持
2. Linux下python连接sqlserver
3. linux + pyodbc + freetds + unixodbc 连接sybase