Python访问Access数据库

内容:利用win32com.client 模块的COM组件访问功能,通过ADODB访问Access的mdb文件

#获取Connection对象
conn = win32com.client.Dispatch('ADODB.Connection')
#设置ConnectionString
conn.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=%s"%(mdb_file) #mdb_file为mdb文件的路径
#打开连接
conn.Open()#这里也可以conn.Open(DSN) DSN内容和ConnectionString一致

此时数据库就连接上了。

成功的平台:win2008 64位系统;office2010 32位;python 32位;ODBC 32位(位于C:/Windows/SysWOW64/odbcad32.exe)打开后有Microsoft Access Driver(*mdb,*accdb)等驱动程序

失败的平台:win7 64位系统;office2013 64位;python 64,32都试了;试着安装了AccessDatabaseEngine2010的,都未成功,目前未找到原因。

#打开已打开的数据库中的已有表或者视图表
rs = win32com.client.Dispatch('ADODB.Recordset')
rs.Open(tablename,conn,1,3)#Open(sql,conn,1,3) 
#rs的Open(Source,ActiveConnection,CursorType,LockType,Options)
#后面的参数3使得表可以被编辑更新。具体详细的参数和意义可以参照ADO程序员参考http://doc.51windows.net/ado/?url=/ado/dir.htm

此时获得了一个可以表,其实只是一个游标,游标指向的是对应表中的一条记录,称为当前记录。我们可以通过一系列的操作读取、编辑当前记录,也可以移动游标来改变当前记录。

#这里对几个重要的函数和属性记录一下
rs.MoveFirst() rs.MoveLast() rs.MoveNext()  rs.MovePrevious()#跟打开表的游标类型有关系。
#用来改变游标所指向的当前记录。
rs.BOF  当前记录位于第一个记录的前面时为True
rs.EOF  当前记录位于最后一个记录之后时为True 判断记录是否遍历完

rs.BOF和rs.EOF同时为True时说明当前rs中没有记录。也就不能进行上面几个操作。
#添加新记录着重记录:
###利用rs.AddNew()即依据rs新建了一条新纪录,rs会指向该记录。
###rs.Fields.Item(1)  rs.Fields.Item("fieldname") 得到当前记录的对应字段的项
###rs.Fields.Item(1).Value = data为对应项赋值
###rs.Fields.Item(0).AppendChunk(blob)  #对于二进制数据需要用此函数赋值

###设置好各项的值之后
###rs.Update()  保存新纪录,也可以保存对记录的修改。调用该方法,需要在打开rs的时候,设置锁定类型具体都可以在  ADO程序员参考http://doc.51windows.net/ado/?url=/ado/dir.htm找到介绍。

至此对于Access 的mdb文件的简单访问就基本实现了。

 

ADO作为访问数据的COM接口,支持多种数据源,多种语言,当然也就支持Python对于Access的访问。对于Python访问Access更深入的学习,应该是对于ADO相关接口类的深入了解。

这里有个对于Python访问数据库的相对清楚的教程:http://www.mayukhbose.com/python/ado/ado-recordset.php

 

最后记录编码问题,Python利用AddNew添加新纪录可以避免编码问题,对于文本可以直接将unicode对象赋值给文本字段。如果利用conn.Execute(insert_sql)或者 rs.Execute(insert_sql)对于insert_sql插入sql字符串,不能插入unicode对象,需要编码为gbk、gb2312、gb18030、utf8等一系列编码,在一些偏僻中文字符上会出现乱码等一系列不可控问题。

posted @ 2015-09-14 15:57  授之以渔  阅读(28623)  评论(2编辑  收藏  举报