Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1806989
  • 博文数量: 473
  • 博客积分: 13997
  • 博客等级: 上将
  • 技术积分: 5953
  • 用 户 组: 普通用户
  • 注册时间: 2010-01-22 11:52
文章分类

全部博文(473)

文章存档

2014年(8)

2013年(38)

2012年(95)

2011年(181)

2010年(151)

分类: 数据库开发技术

2010-04-21 17:49:44

首先,再确定一下我们的目标是:在linux下通过python访问Sql Server!关键字是linux、sqlserver、python。我的系统配置:ubuntu9.10 desktop 64bit、python2.5、SqlServer2005,配置不同的同学在理解原理之余应该也可以自行解决了。 

基本原理

一、Linux下应用程序是一般怎样访问数据库的?

目前比较流行的方法是应用程序通过(Open DataBase Connectivity)来访问数据库。

在ODBC诞生之前,如果要开发数据库应用程序,则必须要使用数据库厂商随数据库产品一同发布的一些工具集来访问数据库,或者在程序中使用嵌入式SQL来访问数据库。当时,对于访问数据库的方法,缺乏一个基于C语言的统一编程接口。ODBC(Open Database Connectivity,开放数据库互连)提供了一种标准的API(应用程序编程接口)方法来访问DBMS(Database Management System)。这些API利用SQL来完成其大部分任务。

见ODBC的架构图,ODBC的驱动管理器自动处理各种数据库驱动与数据源(如各种数据库,甚至Excel)的关系,应用程序只需要使用ODBC的 API即可,底层的细节对于应用程序来说是透明的。熟悉Java的同学回想一下JDBC,与ODBC的思路是一个道理,各种数据库有各自对应的JDBC驱动,同时也会有与之对应的ODBC驱动。

那么,要达到linux下应用程序访问数据库的目的,我们需要安装Linux下的ODBC库:,目前ODBC在各种操作系统上均有实现,如windows的MS ODBC,还有Mac下的iODBC。

需要注意一点就是,要在Linux下让应用程序访问数据库,使用ODBC不是唯一的方法,只是本解决方案的方法。

二、怎样通过程序访问Sqlsever?

众所周知,程序访问数据库通常需要用到数据库的驱动程序(Database Driver)。Sqlserver(及SyBase)使用(Tabular_Data_Stream)作为它的数据库现客户端传输的协议。关于TDS:

 TDS(Tabular_Data_Stream)是一个应用层协议,用于数据库服务器与客户端传递数据,于1984年由Sybase公司发起并开发,用在它们的Sybase Sql Server关系数据库引擎,后来被微软的Sql Server所用。

所以不难理解,SqlServer的Java 驱动包 JTDS,就是TDS的一个Java实现(同时是JDBC的实现)。而For linux,开源社区有一个叫的实现。Linux的程序可以直接通过它来访问SqlServer,是的,可以跳过ODBC。使用ODBC只不过是希望使得更多的方言(不同的编程语言)可以以一致的方式来访问数据库。

三、当Linux遇上SqlServer?

unixODBC使得linux上的程序可以以一统一的方式来访问数据源(这里叫以linux的方式),freetds是专为SqlServer而实现的数据库驱动。那么如果我们要以linux的方式去访问SqlServer呢?那就把两者两者连接起来吧!tdsodbc做这个的,在它的帮助下,linux上的应用程序完全可以不用关心freetds,只要以odbc的方式去访问数据源即可。

四、再加一个Python如何?

是 ODBC的一个python封装,它允许任何平台上的python具有使用ODBC API的能力。那意味着,pyodbc是python语言与ODBC的一条桥梁。

就这样,我们把它们的关系一拉直就是这样:

python程序 ─》pyodbc ─》ODBC(unixODBC) ─》Database Driver(freetds) ─》DataSource/Database。

开始行动

一、安装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数据库连接:

jeff@ubuntu:~$ tsql -H 192.168.0.204 -p 1433 -U sa
locale is "en_US.UTF-8" 
locale charset is "UTF-8"
Password:
1>

这时,成功地在Linux下访问上了远程的Sql Server数据库。胜利迈出了第一步!

二、安装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的时候,我们可以直接往两个配置里面增加内容,但这种方式不推荐,而推荐使用odbcinst命令来安装驱动信息和数据源信息。

配置数据驱动

首先,创建一个tds.driver.template的文件,输入以下内容并保存:

[TDS]
Description = FreeTDS Driver for Linux & MSSQL on Win32
Driver = /usr/lib/odbc/libtdsodbc.so
Setup = /usr/lib/odbc/libtdsS.so

[TDS]这一行意为开始定义一个名叫TDS的数据库驱动,下面是这个数据库的相关属性,请检查一下,Driver和Setup所指的两个lib文件是否存在,如果不存在,要好好检查一下这一步的安装工作有没到位啦,现在把tds.driver.template里定义的数据库驱动安装到系统的 ODBC驱动库,执行如下命令:

root@ubuntu:/home/jeff# odbcinst -i -d -f tds.driver.template

-i 表示install,安装

-d 表示driver,所安装的是驱动

-f 表示file,指定要安装的文件

配置数据源

接下来,创建一个tds.datasource.template文件,输入以下内容并保存:

[my_data]
Description = Connection to windows virtual machine
Driver = TDS
Trace = No
Database = testdb
Server = 192.168.0.2
Port = 1433
TDS_Version = 8.0

[my_data]一行意为开始定义一个名叫my_data的数据源。Driver属性指定的名字是预定义好的TDS驱动,其他是一些数据库的相关属性,如服务器地址,端口等。

现在把tds.datasource.template文件里定义的数据源安装到系统的ODBC数据源中,执行下面的命令:

root@ubuntu:/home/jeff# odbcinst -i -s -l -f tds.datasource.template

-i 表示install,安装

-s 表示source,所安装的是数据源

-l 表示把数据源安装到系统的全局数据源配置文件,用-h则是安装到用户的数据源配置文件中

-f 表示file,指定要安装的文件

OK,把驱动和数据源都安装好了,现在来测试一下通过ODBC访问SQL Server如何吧,使用unixODBC自带的isql命令,使用格式为: isql 数据源名 用户名 密码

root@ubuntu:/home/jeff# isql my_data sa password
+---------------------------------------+
| Connected! |
| |
| sql-statement |
| help [tablename] |
| quit |
| |
+---------------------------------------+
SQL>

如果你看下上面类似的画面,说明ODBC和SQL Server现在沟通得很好,这时你可以在SQL>提示符下输入Sql语句试一把,感觉High吧?还有一步,我们就成功了。

三、安装odbc协议的python实现--pyodbc

到下载pyodbc,解原缩后使用python install.py setup来安装,如果一切顺利那就恭喜你了,如果安装过程报错,那你一定是少了一些什么!我安装pyodbc也装了蛮久才成功,我的经验是:如果报错,检查一下你的系统是否安装了下面的一些lib,如果没有请通过apt-get install来安装:

g++,unixODBC-dev,python-dev

好,到这里假设pyodbc已经安装完毕了。那么,照这里测试一下吧!整个过程就这样分三步走,每一步做完都要保证测试通过,这样中间出错的话,问题也容易定位得多了!

目标达成!不过,当我把这过程写完的时候反而觉得这是小菜一碟了。。。囧。。希望自己没有小题大作,希望对将来不幸要折腾Sql Server的同学有所帮助。

参考文档:

来自赖总的经验:http://blog.csdn.net/lanphaday/archive/2009/01/20/3838967.aspx

和这位老外兄弟就mac上的连接问题沟通了几次,他这篇linux+mssql的文档值得一读:http://blog.singletoned.net/2009/07/connecting-to-ms-sql-server-from-python-on-linux/

阅读(1975) | 评论(2) | 转发(0) |
给主人留下些什么吧!~~

chinaunix网友2011-05-25 10:49:32

不错啊..偶是菜菜鸟,刚连接OK了. 但是输SQL语句报错..Could not SQLPrepare...还望指点哦..

chinaunix网友2011-05-17 14:35:56

非常感谢!