版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、 老巫 2003.09.1019 September, 2003 用PYTHON语言进行数据库编程, 至少有六种方法可供采用. 我在实际项目中采用,不但功能强大,而且方便快捷.以下是我在工作和学习中经验总结. 方法一:使用DAO (Data Access Objects) 这个第一种方法可能会比较过时啦.不过还是非常有用的. 假设你已经安装好了PYTHONWIN,现在开始跟我上路吧找到工具栏上ToolsCOM MakePy utilities,你会看到弹出一个Select Library的对话框, 在列表中选择Microsoft DAO 3.6 Object Library(或者是你所有的版本
2、).现在实现对数据的访问: #实例化数据库引擎 import win32com.clientengine = win32com.client.Dispatch(DAO.DBEngine.35) #实例化数据库对象,建立对数据库的连接 db = engine.OpenDatabase(rc:tempmydb.mdb) 现在你有了数据库引擎的连接,也有了数据库对象的实例.现在就可以打开一个recordset了. 假设在数据库中已经有一个表叫做 customers. 为了打开这个表,对其中数据进行处理,我们使用下面的语法: rs = db.OpenRecordset(customers) #可以采用
3、SQL语言对数据集进行操纵 rs = db.OpenRecordset(select * from customers where state = OH)你也可以采用DAO的execute方法. 比如这样: db.Execute(delete * from customers where balancetype = overdue and name = bill) #注意,删除的数据不能复原了JEOF 等属性也是可以访问的, 因此你能写这样的语句: while not rs.EOF: print rs.Fields(State).Value rs.MoveNext() 我最开始采用这个方法,感
4、觉不错. 方法二:使用Python DB API,Python ODBC modules(you can use ODBC API directly, but maybe it is difficult for most beginner.)为了在Python里面也能有通用的数据库接口,DB-SIG为我们提供了Python数据库.(欲知详情,访问DB-SIG的网站,/sigs/db-sig/). MarkHammond的win32扩展PythonWin里面包含了这些API的一个应用-odbc.pyd. 这个数据库API仅仅开放了一些有限的ODBC函数的功
5、能(那不是它的目的),但是它使用起来很简单,而且在win32里面是免费的.安装odbc.pyd的步骤如下: 1. 安装python软件包: /download/ 2. 安装Mark Hammond的最新版本的python win32扩展 - PythonWin: /crew/mhammond/ 3. 安装必要的ODBC驱动程序,用ODBC管理器为你的数据库配置数据源等参数 你的应用程序将需要事先导入两个模块: dbi.dll - 支持各种各样的SQL数据类型,例如:日期-dates odbc.pyd 编译
6、产生的ODBC接口 下面有一个例子: import dbi, odbc # 导入ODBC模块 import time # 标准时间模块 dbc = odbc.odbc( # 打开一个数据库连接 sample/monty/spam # 数据源/用户名/密码 ) crsr = dbc.cursor() # 产生一个cursor crsr.execute( # 执行SQL语言 SELECT country_id, name, insert_change_date FROM country ORDER BY name ) print Column descriptions: # 显示行描述 for c
7、ol in crsr.description: print , col result = crsr.fetchall() # 一次取出所有的结果 print nFirst result row:n , result0 # 显示结果的第一行 print nDate conversions: # 看看dbiDate对象如何? date = result0-1 fmt = %-25s%-20s print fmt % (standard string:, str(date) print fmt % (seconds since epoch:, float(date) timeTuple = time
8、.localtime(date) print fmt % (time tuple:, timeTuple) print fmt % (user defined:, time.strftime(%d %B %Y, timeTuple)下面是结果: -输出(output)- Column descriptions: (country_id, NUMBER, 12, 10, 10, 0, 0) (name, STRING, 45, 45, 0, 0, 0) (insert_change_date, DATE, 19, 19, 0, 0, 1) First result row: (24L, ARGE
9、NTINA, ) Date conversions: standard string: Fri Dec 19 01:51:53 1997 seconds since epoch: .0 time tuple: (1997, 12, 19, 1, 51, 53, 4, 353, 0) user defined: 19 December 1997 大家也可以去/windows/win32/odbc.html看看,那儿有两个Hirendra Hindocha写的例子,还不错. 注意, 这个例子中,结果值被转化为Python对象了.时间被转化为一个dbiDate
10、对象.这里会有一点限制,因为dbiDate只能表示UNIX时间(1 Jan 1970 00:00:00 GMT)之后的时间.如果你想获得一个更早的时间,可能会出现乱码甚至引起系统崩溃.*_* 方法三: 使用 calldll模块(Using this module, you can use ODBC API directly. But now the python version is 2.1, and I dont know if other version is compatible with it. 老巫:-) Sam Rushing的calldll模块可以让Python调用任何动态连接库
11、里面的任何函数,厉害吧?哈.其实,你能够通过直接调用odbc32.dll里面的函数操作ODBC.Sam提供了一个包装模块odbc.py,就是来做这个事情的.也有代码来管理数据源,安装ODBC,实现和维护数据库引擎 (Microsoft Access).在那些演示和例子代码中,还有一些让人侧目的好东东,比如cbdemo.py,有一个信息循环和窗口过程的Python函数! 你可以到Sams Python Software去找到calldll的相关连接,那儿还有其他好多有趣的东西 下面是安装CALLDLL包的步骤: 1. 安装PYTHON软件包(到现在为止最多支持2.1版本) 2. 下载calldl
12、l-2001-05-20.zip: /pub/python/python-ext/calldll-2001-05-20.zip 3. 在LIB路径下面创建一个新路径比如说: c:Program FilesPythonlibcaldll 4. 在原目录下解压calldll.zip 5. 移动calldlllib中所有的文件到上面一个父目录(calldll)里面,删除子目录(lib) 6. 在CALL目录里面生成一个file _init_.py文件,象这样: # File to allow this directory to be treated
13、as a python 1.5package. 7. 编辑calldllodbc.py: 在get_info_word和get_info_long里面,改变calldll.membuf为windll.membuf 下面是一个怎么使用calldll的例子: from calldll import odbc dbc = odbc.environment().connection() # create connection dbc.connect(sample, monty, spam) # connect to db # alternatively, use full connect string
14、: # dbc.driver_connect(DSN=sample;UID=monty;PWD=spam) print DBMS: %s %sn % ( # show DB information dbc.get_info(odbc.SQL_DBMS_NAME), dbc.get_info(odbc.SQL_DBMS_VER) ) result = dbc.query( # execute query & return results SELECT country_id, name, insert_change_date FROM country ORDER BY name ) print C
15、olumn descriptions: # show column descriptions for col in result0: print , col print nFirst result row:n , result1 # show first result row -output(输出)- DBMS: Oracle 07.30.0000 Column descriptions: (COUNTRY_ID, 3, 10, 0, 0) (NAME, 12, 45, 0, 0) (INSERT_CHANGE_DATE, 11, 19, 0, 1) First result row: 24,
16、 ARGENTINA, 1997-12-19 01:51:53 方法四: 使用ActiveX Data Object(ADO)现在给出一个通过Microsofts ActiveX Data Objects (ADO)来连接MS Access 2000数据库的实例.使用ADO有以下几个好处: 首先,与DAO相比,它能更快地连接数据库;其次,对于其他各种数据库(SQL Server, Oracle, MySQL, etc.)来说,ADO都是非常有效而方便的;再有,它能用于XML和文本文件和几乎其他所有数据,因此微软也将支持它比DAO久一些. 第一件事是运行makepy.尽管这不是必须的,但是它对于
17、提高速度有帮助的.而且在PYTHONWIN里面运行它非常简单: 找到工具栏上ToolsCOM MakePy utilities,你会看到弹出一个Select Library的对话框, 在列表中选择Microsoft ActiveX Data Objects 2.5 Library (或者是你所有的版本).然后你需要一个数据源名Data Source Name DSN 和一个连接对象. 我比较喜欢使用DSN-Less 连接字符串 (与系统数据源名相比,它更能提高性能且优化代码)就MS Access来说,你只需要复制下面的DSN即可.对于其他数据库,或者象密码设置这些高级的功能来说,你需要去 Co
18、ntrol Panel控制面板 | 管理工具Administrative Tools | 数据源Data Sources (ODBC). 在那里,你可以设置一个系统数据源DSN. 你能够用它作为一个系统数据源名,或者复制它到一个字符串里面,来产生一个DSN-Less 的连接字符串. 你可以在网上搜索DSN-Less 连接字符串的相关资料. 好了,这里有一些不同数据库的DSN-Less连接字符串的例子:SQL Server, Access, FoxPro, Oracle , Oracle, Access, SQL Server, 最后是 MySQL. import win32com.client
19、 conn = win32com.client.Dispatch(rADODB.Connection) DSN = PROVIDER=Microsoft.Jet.OLEDB.4.0;DATA SOURCE=C:/MyDB.mdb; conn.Open(DSN)经过上面的设置之后,就可以直接连接数据库了:首要的任务是打开一个数据集/数据表 rs = win32com.client.Dispatch(rADODB.Recordset) rs_name = MyRecordset rs.Open( + rs_name + , conn, 1, 3) 1和3是常数.代表adOpenKeyset 和ad
20、LockOptimistic.我用它作为默认值,如果你的情况不同的话,或许你应该改变一下.进一步的话题请参考ADO相关材料.打开数据表后,你可以检查域名和字段名等等 flds_dict = for x in range(rs.Fields.Count): . flds_dictx = rs.Fields.Item(x).Name 字段类型和长度被这样返回A : print rs.Fields.Item(1).Type202 # 202 is a text field print rs.Fields.Item(1).DefinedSize50 # 50 Characters 现在开始对数据集进行
21、操作.可以使用SQL语句INSERT INTO或者AddNew() 和Update() rs.AddNew() rs.Fields.Item(1).Value = data rs.Update()这些值也能够被返回: x = rs.Fields.Item(1).Value print xdata 因此如果你想增加一条新的记录,不必查看数据库就知道什么number 和AutoNumber 字段已经产生了 rs.AddNew() x = rs.Fields.Item(Auto_Number_Field_Name).Value # x contains the AutoNumber rs.Field
22、s.Item(Field_Name).Value = data rs.Update()使用ADO,你也能得到数据库里面所有表名的列表: oCat = win32com.client.Dispatch(rADOX.Catalog) oCat.ActiveConnection = conn oTab = oCat.Tables for x in oTab: . if x.Type = TABLE: . print x.Name 关闭连接. 注意这里C是大写,然而关闭文件连接是小写的c. conn.Close() 前面提到,可以使用SQL语句来插入或者更新数据,这时我们直接使用一个连接对象. con
23、n = win32com.client.Dispatch(rADODB.Connection) DSN = PROVIDER=Microsoft.Jet.OLEDB.4.0;DATA SOURCE=C:/MyDB.mdb; sql_statement = INSERT INTO Table_Name (Field_1, Field_2) VALUES (data1, data2) conn.Open(DSN) conn.Execute(sql_statement) conn.Close() 最后一个例子经常被看作是ADO的难点.一般说来,想要知道一个表的RecordCount 的话,必须象这样
24、一个一个地计算他们 : # See example 3 above for the set-up to this rs.MoveFirst() count = 0 while 1:. if rs.EOF:. break. else:. count = count + 1. rs.MoveNext() 如果你也象上面那样些程序的话,非常底效不说,如果数据集是空的话,移动第一个记录的操作会产生一个错误.ADO提供了一个方法来纠正它.在打开数据集之前,设置CursorLocation 为3. 打开数据集之后,就可以知道recordcount了. rs.Cursorlocation = 3 # dont use parenthesis here rs.Open(SELECT * FROM Table_Name, conn) # be sure conn is open rs.RecordCount # no parenthesis here either 186 再:3是常数这些只用到ADO的皮毛功夫,但对于从PYTHON来连接数据库,它还是应该有帮助的.想更进一步学习的话,建
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025-2026学年1和许多数学说课稿
- 2025-2026学年4和5的点数说课稿
- 船体冷加工安全培训效果考核试卷含答案
- 2025-2026学年大班拍网球说课稿
- 手风琴装配工安全技能能力考核试卷含答案
- 纺织品裁剪工安全生产规范知识考核试卷含答案
- 2025-2026学年二年级写动物说课稿反思
- 2025-2026学年七年级跳山羊教学说课稿
- 印染成品定等工创新方法知识考核试卷含答案
- 硅晶片抛光工诚信品质水平考核试卷含答案
- 3.2.1 分数除以整数 教学课件2026-2027学年人教版数学六年级上册
- 译林版七年级英语上册知识清单
- 2026秋冀少版新教材七年级上册生物学每课知识点清单
- 中国重症患者液体管理专家共识(2026版)
- 2026年全国翻译专业资格考试(CATTI)三级口译英语口译综合能力真题
- 2026国睿防务公司反无人机雷达总体工程师岗位招聘笔试历年参考题库附带答案详解
- 雨课堂学堂在线学堂云《声纳技术(中国人民解放军海军航空)》单元测试考核答案
- 重症医学临床路径标准化
- 稻盛和夫心法课件
- 雨课堂学堂在线学堂云《临床伦理与科研道德(山东大学)》单元测试考核答案
- 2025年住院医师规范化师资培训考试题附答案
评论
0/150
提交评论