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

本文介绍了如何在Windows环境下使用Python通过ODBC和ADO接口访问数据库,涉及ActivePython、ODBC模块、ADODBAPI的安装与使用,以及连接Access数据库的示例代码。内容包括建立数据库连接、执行SQL查询、处理查询结果和关闭连接等步骤。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

关键词: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作为格式化时间函数的输入。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值