日期:2014-05-16  浏览次数:20527 次

用Python实现数据库编程

用PYTHON语言进行数据库编程, 至少有六种方法可供采用. 我在实际项目中采用,不但功能强大,而且方便快捷.以下是我在工作和学习中经验总结.

方法一:使用DAO (Data Access Objects)

这个第一种方法可能会比较过时啦.不过还是非常有用的. 假设你已经安装好了PYTHONWIN,现在开始跟我上路吧……

找到工具栏上ToolsàCOM MakePy utilities,你会看到弹出一个Select Library的对话框, 在列表中选择'Microsoft DAO 3.6 Object Library'(或者是你所有的版本).

现在实现对数据的访问:

???? #实例化数据库引擎

???? import win32com.client

engine = win32com.client.Dispatch("DAO.DBEngine.35")

???? #实例化数据库对象,建立对数据库的连接

???? db = engine.OpenDatabase(r"c:\temp\mydb.mdb")

现在你有了数据库引擎的连接,也有了数据库对象的实例.现在就可以打开一个recordset了. 假设在数据库中已经有一个表叫做 'customers'. 为了打开这个表,对其中数据进行处理,我们使用下面的语法:

???? 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'")

???? #注意,删除的数据不能复原了J

EOF 等属性也是可以访问的, 因此你能写这样的语句:

???? while not rs.EOF:

???????? print rs.Fields("State").Value

???????? rs.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

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://starship.python.net/crew/mhammond/

?? 3. 安装必要的ODBC驱动程序,用ODBC管理器为你的数据库配置数据源等参数

你的应用程序将需要事先导入两个模块:

?? dbi.dll?? - 支持各种各样的SQL数据类型,例如:日期-dates

?? odbc.pyd – 编译产生的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 col in crsr.description:

??????? print ' ', col

??? result = crsr.fetchall()?????? # 一次取出所有的结果

??? print '\nFirst result row:\n ', result[0]?? # 显示结果的第一行

??? print '\nDate conversions:'??? # 看看dbiDate对象如何?

??? date = result[0][-1]

??? fmt = '?? %-25s%-20s'

??? print fmt % ('standard string:', str(date))

??? print fmt % ('seconds since epoch:', 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)

??? First result row:

????? (24L, 'ARGENTINA', <DbiDate object at 7f1c80>)

??? Date conversions:

????? standard string:????????? Fri Dec 19 01:51:53 1997

????? seconds since epoch:????? 882517913.0

????? time 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写的例子,还不错.

注意, 这个例子中,结果值被转化为Python对象了.时间被转化为一个dbiDate对象.这里会有一点限制,因为dbiDate只能表示UNIX时间(1 Jan 1970 00:00:00 GMT)之后的时间.如果你想获得一个更早的时间,可能会出现乱码甚至引起系统崩溃.*_*

方法三: 使用 calldll模块

(Using this module, you can use ODBC API directly. But n