收藏 分享(赏)

用PYTHON进行数据库编程.doc

上传人:11xg27ws 文档编号:7842291 上传时间:2019-05-27 格式:DOC 页数:10 大小:79.50KB
下载 相关 举报
用PYTHON进行数据库编程.doc_第1页
第1页 / 共10页
用PYTHON进行数据库编程.doc_第2页
第2页 / 共10页
用PYTHON进行数据库编程.doc_第3页
第3页 / 共10页
用PYTHON进行数据库编程.doc_第4页
第4页 / 共10页
用PYTHON进行数据库编程.doc_第5页
第5页 / 共10页
点击查看更多>>
资源描述

1、标题 用 Python 实现数据库编程 wfh_178(原作) 关键字 Python Database programming 数据库编程老巫 2003.09.1019 September, 2003用 PYTHON语言进行数据库编程, 至少有六种方法可供采用. 我在实际项目中采用,不但功能强大,而且方便快捷.以下是我在工作和学习中经验总结.方法一:使用 DAO (Data Access Objects)这个第一种方法可能会比较过时啦.不过还是非常有用的. 假设你已经安装好了 PYTHONWIN,现在开始跟我上路吧找到工具栏上 ToolsCOM MakePy utilities,你会看到弹出一

2、个 Select Library的对话框, 在列表中选择Microsoft DAO 3.6 Object Library(或者是你所有的版本).现在实现对数据的访问:#实例化数据库引擎import win32com.clientengine = win32com.client.Dispatch(“DAO.DBEngine.35“)#实例化数据库对象,建立对数据库的连接db = engine.OpenDatabase(r“c:tempmydb.mdb“)现在你有了数据库引擎的连接,也有了数据库对象的实例.现在就可以打开一个 recordset了. 假设在数据库中已经有一个表叫做 customer

3、s. 为了打开这个表,对其中数据进行处理,我们使用下面的语法:rs = db.OpenRecordset(“customers“)#可以采用 SQL语言对数据集进行操纵rs = db.OpenRecordset(“select * from customers where state = OH“)你也可以采用 DAO的 execute方法. 比如这样:db.Execute(“delete * from customers where balancetype = overdue and name = bill“)#注意,删除的数据不能复原了 EOF 等属性也是可以访问的, 因此你能写这样的语句:

4、while not rs.EOF:print rs.Fields(“State“).Valuers.MoveNext()我最开始采用这个方法,感觉不错.方法二:使用 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的网站,http:/www.python.org/sigs/db-sig/). Mark

5、Hammond的 win32扩展 PythonWin里面包含了这些 API的一个应用-odbc.pyd. 这个数据库 API仅仅开放了一些有限的 ODBC函数的功能(那不是它的目的),但是它使用起来很简单,而且在 win32里面是免费的.安装 odbc.pyd的步骤如下:1. 安装 python软件包:http:/www.python.org/download/ 2. 安装 Mark Hammond的最新版本的 python win32扩展 - PythonWin:http:/ 3. 安装必要的 ODBC驱动程序,用 ODBC管理器为你的数据库配置数据源等参数你的应用程序将需要事先导入两个模块

6、:dbi.dll - 支持各种各样的 SQL数据类型,例如:日期-datesodbc.pyd 编译产生的 ODBC接口下面有一个例子:import dbi, odbc # 导入 ODBC模块import time # 标准时间模块dbc = odbc.odbc( # 打开一个数据库连接sample/monty/spam # 数据源/用户名/密码)crsr = dbc.cursor() # 产生一个 cursorcrsr.execute( # 执行 SQL语言“SELECT country_id, name, insert_change_dateFROM countryORDER BY name

7、“)print Column descriptions: # 显示行描述for col in crsr.description:print , colresult = crsr.fetchall() # 一次取出所有的结果print nFirst result row:n , result0 # 显示结果的第一行print nDate conversions: # 看看 dbiDate对象如何?date = result0-1fmt = %-25s%-20sprint fmt % (standard string:, str(date)print fmt % (seconds since ep

8、och:, float(date)timeTuple = time.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)Fir

9、st result row:(24L, ARGENTINA, )Date conversions:standard string: Fri Dec 19 01:51:53 1997seconds since epoch: 882517913.0time tuple: (1997, 12, 19, 1, 51, 53, 4, 353, 0)user defined: 19 December 1997大家也可以去 http:/www.python.org/windows/win32/odbc.html看看,那儿有两个 Hirendra Hindocha写的例子,还不错.注意, 这个例子中,结果值被

10、转化为 Python对象了.时间被转化为一个 dbiDate对象.这里会有一点限制,因为 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 Rush

11、ing的 calldll模块可以让 Python调用任何动态连接库里面的任何函数,厉害吧?哈.其实,你能够通过直接调用 odbc32.dll里面的函数操作 ODBC.Sam提供了一个包装模块 odbc.py,就是来做这个事情的.也有代码来管理数据源,安装 ODBC,实现和维护数据库引擎 (Microsoft Access).在那些演示和例子代码中,还有一些让人侧目的好东东,比如 cbdemo.py,有一个信息循环和窗口过程的 Python函数!你可以到 Sams Python Software去找到 calldll的相关连接,那儿还有其他好多有趣的东西下面是安装 CALLDLL包的步骤:1.

12、安装 PYTHON软件包(到现在为止最多支持 2.1版本)2. 下载 calldll-2001-05-20.zip:ftp:/ 在 LIB路径下面创建一个新路径比如说:c:Program FilesPythonlibcaldll4. 在原目录下解压 calldll.zip5. 移动 calldlllib中所有的文件到上面一个父目录(calldll)里面,删除子目录(lib)6. 在 CALL目录里面生成一个 file _init_.py文件,象这样:# File to allow this directory to be treated as a python 1.5package.7. 编辑

13、 calldllodbc.py:在“get_info_word“和“get_info_long“里面,改变“calldll.membuf“为“windll.membuf“下面是一个怎么使用 calldll的例子:from calldll import odbcdbc = odbc.environment().connection() # create connectiondbc.connect(sample, monty, spam) # connect to db# alternatively, use full connect string:# dbc.driver_connect(DSN

14、=sample;UID=monty;PWD=spam)print DBMS: %s %sn % ( # show DB informationdbc.get_info(odbc.SQL_DBMS_NAME),dbc.get_info(odbc.SQL_DBMS_VER)result = dbc.query( # execute query 其次,对于其他各种数据库(SQL Server, Oracle, MySQL, etc.)来说,ADO 都是非常有效而方便的;再有,它能用于 XML和文本文件和几乎其他所有数据,因此微软也将支持它比 DAO久一些.第一件事是运行 makepy.尽管这不是必须

15、的,但是它对于提高速度有帮助的.而且在 PYTHONWIN里面运行它非常简单: 找到工具栏上 ToolsCOM MakePy utilities,你会看到弹出一个 Select Library的对话框, 在列表中选择Microsoft ActiveX Data Objects 2.5 Library (或者是你所有的版本).然后你需要一个数据源名 Data Source Name DSN 和一个连接对象. 我比较喜欢使用 DSN-Less 连接字符串 (与系统数据源名相比,它更能提高性能且优化代码)就 MS Access来说,你只需要复制下面的 DSN即可.对于其他数据库,或者象密码设置这些高

16、级的功能来说,你需要去 Control Panel 控制面板 | 管理工具 Administrative Tools | 数据源 Data Sources (ODBC). 在那里,你可以设置一个系统数据源 DSN. 你能够用它作为一个系统数据源名,或者复制它到一个字符串里面,来产生一个 DSN-Less 的连接字符串. 你可以在网上搜索 DSN-Less 连接字符串的相关资料. 好了,这里有一些不同数据库的 DSN-Less连接字符串的例子: SQL Server, Access, FoxPro, Oracle , Oracle, Access, SQL Server, 最后是 MySQL.

17、import win32com.client 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和

18、3是常数.代表 adOpenKeyset 和 adLockOptimistic.我用它作为默认值,如果你的情况不同的话,或许你应该改变一下.进一步的话题请参考 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

19、# 50 Characters现在开始对数据集进行操作.可以使用 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 co

20、ntains the AutoNumber rs.Fields.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语

21、句来插入或者更新数据,这时我们直接使用一个连接对象. conn = 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的难点.一

22、般说来,想要知道一个表的 RecordCount 的话,必须象这样一个一个地计算他们 : # 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. 打开数据集之后,就可以知道 recor

23、dcount了. rs.Cursorlocation = 3 # dont use parenthesis here rs.Open(SELECT * FROM Table_Name, conn) # be sure conn is open rs.RecordCount # no parenthesis here either186再:3 是常数 这些只用到 ADO的皮毛功夫,但对于从 PYTHON来连接数据库,它还是应该有帮助的.想更进一步学习的话,建议深入对象模型.下面是一些连接:http:/ script就不行?老巫疑惑)方法五:使用 mxODBC 模块(在 Windows和 Unix

24、下面都可以用,但是是商业化软件,要掏钱的.)下面是相关连接:http:/ 对具体的数据库使用特定的 PYTHON模块MySQL数据库 MySQLdb 模块,下载地址为:http:/ psycopg 模块PostgresSQL的主页为: http:/www.postgresql.org/Python/PostgresSQL模块下载地址: http:/initd.org/software/psycopgOracle数据库 DCOracle 模块下载地址: http:/www.zope.org/Products/DCOraclecx_oracle 模块下载地址: http:/ Copyright 老巫 2003

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 企业管理 > 管理学资料

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报