您的位置:首页 > 编程语言 > Python开发

Windows下使用Python通过ODBC/ADO访问数据库

2005-03-22 13:44 851 查看
关键词:Python 数据库 ODBC ADO

Python的确是一个很好的脚本语言,简洁而且功能很强。可惜文档资料奇缺,最近学Python,手里唯一
的一本《Python技术参考大全》已经过时很久了。想用Python-ASP做一个数据库驱动的网站,可是用Python
连接数据库的中文资料很难找到,没办法,只好自己摸索了,下面就是我的一些学习心得。

准备工具:
<1>下载并安装ActivePython(http://activestate.com/Products/Dow...id=ActivePython)
有Windows下的Msi安装包,直接安装即可,安装程序关联了.py,.pyw,.pyc,.pyw等文件类型,并且已经设置好
各种Win32扩展工具包。我用的是2.2.3版,安装在C:/Python22。
<2>安装CJK编码解码库(http://cjkpython.i18n.org/)。包括gb2312,gbk,gb18030,big5等encodings,
根据你的Python版本,直接下载相应的exe安装包,与Python 2.2.3对应的版本是cjkcodecs-1.1.win32-py2.2.exe。
下载后直接运行,自动识别安装的Python,不需要任何设置。
<3>安装Egenix mxBase(http://www.egenix.com/files/python/...Extensions.html)。
包含用于数据处理的一些有用的工具,如DateTime可用来处理数据库中的时间日期型字段。
对应Python 2.2.3的当前版本是egenix-mx-base-2.0.5.win32-py2.2.exe,同样是自动安装。
<4>安装ADODBAPI(http://sourceforge.net/projects/adodbapi)。这是一个完全实现了Python DB API 2.0规范
的Python-ADO接口模块,使用很方便。下载adodbapi-2.0.1.zip解压缩后执行Setup.bat即可完成安装。

编写代码:
下面的代码使用了一个Access数据库C:/Apps/Misc.mdb,设置的ODBC数据源名称为Misc,
包含一个数据表testdb,共4个字段,长整型id,字符型tx,逻辑型bl,时间日期型dt
<1>使用ActivePython内含的ODBC模块访问数据库
示例代码:
import sys,time,locale
from odbc import *
try:
odbcconn=odbc("DSN=Misc") # 建立连接
except:
print "无法连接到数据库!"
sys.exit()
locale.setlocale(locale.LC_ALL,"") # 设置缺省区域(用于显示中文星期)
try:
odbccur=odbcconn.cursor() # 取得游标
odbccur.execute("select id,tx,bl,dt from testdb") # 执行SQL查询
therow=odbccur.fetchone() # 取一行
while therow<>None: # 判断是否为空
id=int(therow[0]) # 转换为整数
print "id=",id,
tx=therow[1]
print "tx=",tx,
bl=int(therow[2]) # 逻辑值转换为整数(0=false 1=true)
print "bl=",bl,
dt=time.localtime(therow[3]) # 转换为表示本地时间的元组类型
print "dt=",time.strftime("%Y年%m月%d日,%a,%H时%M分%S秒", dt) # 格式化输出时间
therow=odbccur.fetchone() # 取下一行
finally:
odbccur.close()
odbcconn.close()

运行结果:
id= 1 tx= 怪兽 bl= 1 dt= 2003年12月10日,星期三,09时12分32秒
id= 2 tx= 魔物 bl= 0 dt= 2002年12月11日,星期三,08时12分43秒
id= 3 tx= 石头 bl= 1 dt= 2004年08月03日,星期二,21时34分06秒

分析:
这段代码的功能是获取和显示数据库的全部内容。
第一步,导入odbc模块
import odbc 或 from odbc import *
第二步,建立连接,使用
connection=odbc(connection_string)
第三步,创建游标,并通过游标执行SQL语句
cursor = connection.cursor()
int = cursor.execute(sql, [var, ...] )
第四步,获取并解析结果集。
data = cursor.fetchone() # 取一行
[data, ...] = cursor.fetchmany() # 取多行
[data, ...] = cursor.fetchall() # 取全部行
然后从data元组中取出各字段,转换成正确的数据类型
最后,关闭游标和连接
cursor.close()
connection.close()

<2>使用ADODBAPI访问数据库
示例代码:
import sys,locale,adodbapi,time
try:
conn=adodbapi.connect(r"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:/Apps/AppData/Access/Misc.mdb;")
except:
print "无法连接到数据库!"
sys.exit()
locale.setlocale(locale.LC_ALL,"") # 设置缺省区域(用于显示中文星期)
try:
cur=conn.cursor() # 取得游标
cur.execute("select id,tx,bl,dt from testdb") # 执行SQL查询
therow=cur.fetchone() # 取一行
while therow<>None: # 判断是否为空
id=int(therow[0]) # 转换为整数
print "id=",id,
tx=therow[1]
print "tx=",tx.encode("gb2312"),
bl=int(therow[2]) # 逻辑值转换为整数(0=false 1=true)
print "bl=",bl,
dt=therow[3] # 由于安装了mxBase,therow[3]被自动转换为DateTime类型
print "dt=",time.strftime("%Y年%m月%d日,%a,%H时%M分%S秒", dt.tuple())
therow=cur.fetchone() # 取下一行
finally:
cur.close()
conn.close()

运行结果:同ODBC版本

分析:
基本上和ODBC版本一样,只是取得连接的语句变为connection=adodbapi.connect(connecion_string),
ADO的连接字符串有多种写法,这里使用Microsoft Jet OLEDB Provider 4.0直接连接。
ADODBAPI是用纯Python写成的,功能比odbc模块强,适用范围也比较广,推荐使用。
另外,这里取得的tx是Unicode字符串,无法直接print,需要编码为GB2312。

以上是通过ODBC和ADO访问数据库的大致方法,实际上对于Access数据库,直接使用Jet引擎访问,
也不是很复杂。

附记1:以上代码在Python 2.2运行通过,但移植到Python 2.3时,需要作一些修改。
<1>Python 2.3要求指定源文件编码,如gb2312,utf_8,gbk,gb18030,big5等。
方法为,在源代码文件顶行写
#-*-coding:编码名称-*-
如果安装了CJK编码解码库,则可以用
#-*-coding:gb2312-*-
来指定使用GB2312编码,否则,即使只在注释中用了中文,也会产生警告。
<2>ODBC版本的程序只需要指定GB2312编码就可以在Python 2.3正常运行,ADO版本需要作修改。
原因是,ODBC版本得到的时间日期数据therow[3]是一个DbiDate类型(实际上可能是float),
可以用time.localtime()转换为Python 2.2的time类型;而ADODBAPI会自动进行类型转换。
转换规则是:对Python 2.2,转换为time类型;对Python 2.3,转换为datetime类型;
如果安装了mxBase,则转换为DateTime类型,各类型提供的方法可参考其文档。
据此,在Python 2.3(未安装mxBase),代码中相关的部分应改为:
dt=therow[3] # therow[3] 是 datetime.datetime 型数据
print "dt=",time.strftime("%Y年%m月%d日,%a,%H时%M分%S秒", dt.timetuple())
这里用到的datetime.timetuple()方法是把datetime对象转换为一个九元tuple作为格式化时间函数的输入。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息