python实现数据库编程方法详解

本文实例讲述了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’, )
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 now the python version is 2.1, and i don’t know if other version is compatible with it. 老巫:-)

sam rushing的calldll模块可以让python调用任何动态连接库里面的任何函数,厉害吧?哈.其实,你能够通过直接调用odbc32.dll里面的函数操作odbc.sam提供了一个包装模块odbc.py,就是来做这个事情的.也有代码来管理数据源,安装odbc,实现和维护数据库引擎 (microsoft access).在那些演示和例子代码中,还有一些让人侧目的好东东,比如cbdemo.py,有一个信息循环和窗口过程的python函数!

[你可以到sam’s python software去找到calldll的相关连接,那儿还有其他好多有趣的东西]

下面是安装calldll包的步骤:

1. 安装python软件包(到现在为止最多支持2.1版本)

2. 下载calldll-2001-05-20.zip:

ftp://squirl.nightmare.com/pub/python/python-ext/calldll-2001-05-20.zip

3. 在lib路径下面创建一个新路径比如说:

c:/program files/python/lib/caldll/

4. 在原目录下解压calldll.zip

5. 移动calldll/lib/中所有的文件到上面一个父目录(calldll)里面,删除子目录(lib)

6. 在call目录里面生成一个file __init__.py文件,象这样:

# file to allow this directory to be treated as a python 1.5
package.

7. 编辑calldll/odbc.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:
# dbc.driver_connect(‘dsn=sample;u)
print ‘dbms: %s %s/n’ % ( # 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 ‘column descriptions:’ # show column descriptions
for col in result[0]:
print ‘ ‘, col
print ‘/nfirst result row:/n ‘, result[1] # 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’, ‘argentina’, ‘1997-12-19 01:51:53’]

方法四: 使用activex data object(ado)

现在给出一个通过microsoft’s activex data objects (ado)来连接ms access 2000数据库的实例.使用ado有以下几个好处: 首先,与dao相比,它能更快地连接数据库;其次,对于其他各种数据库(sql server, oracle, mysql, etc.)来说,ado都是非常有效而方便的;再有,它能用于xml和文本文件和几乎其他所有数据,因此微软也将支持它比dao久一些.

第一件事是运行makepy.尽管这不是必须的,但是它对于提高速度有帮助的.而且在pythonwin里面运行它非常简单: 找到工具栏上toolsàcom makepy utilities,你会看到弹出一个select library的对话框, 在列表中选择’microsoft activex data objects 2.5 library ‘(或者是你所有的版本).

然后你需要一个数据源名data source name [dsn] 和一个连接对象. [我比较喜欢使用dsn-less 连接字符串 (与系统数据源名相比,它更能提高性能且优化代码)]
就ms access来说,你只需要复制下面的dsn即可.对于其他数据库,或者象密码设置这些高级的功能来说,你需要去 [control 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
>>> conn = win32com.client.dispatch(r’adodb.connection’)
>>> dsn = ‘provider=microsoft.jet.oledb.4.0;data source=c:/mydb.mdb;’
>>> conn.open(dsn)

经过上面的设置之后,就可以直接连接数据库了:

首要的任务是打开一个数据集/数据表

>>> rs = win32com.client.dispatch(r’adodb.recordset’)
>>> rs_name = ‘myrecordset’
>>> rs.open(‘[‘ + rs_name + ‘]’, conn, 1, 3)

[1和3是常数.代表adopenkeyset 和adlockoptimistic.我用它作为默认值,如果你的情况不同的话,或许你应该改变一下.进一步的话题请参考ado相关材料.]

打开数据表后,你可以检查域名和字段名等等

>>> flds_dict = {}
>>> for x in range(rs.fields.count):
… flds_dict[x] = rs.fields.item(x).name

字段类型和长度被这样返回a :

>>> print rs.fields.item(1).type
202 # 202 is a text field
>>> print rs.fields.item(1).definedsize
50 # 50 characters

现在开始对数据集进行操作.可以使用sql语句insert into或者addnew() 和update()

>>> rs.addnew()
>>> rs.fields.item(1).value = ‘data’
>>> rs.update()

这些值也能够被返回:

>>> x = rs.fields.item(1).value
>>> print x
‘data’

因此如果你想增加一条新的记录,不必查看数据库就知道什么number 和autonumber 字段已经产生了

>>> rs.addnew()
>>> x = rs.fields.item(‘auto_number_field_name’).value
# x contains the autonumber
>>> rs.fields.item(‘field_name’).value = ‘data’
>>> rs.update()

使用ado,你也能得到数据库里面所有表名的列表:

>>> ocat = win32com.client.dispatch(r’adox.catalog’)
>>> ocat.activeconnection = conn
>>> otab = ocat.tables
>>> for x in otab:
… if x.type == ‘table’:
… print x.name

关闭连接. 注意这里c是大写,然而关闭文件连接是小写的c.

>>> conn.close()

前面提到,可以使用sql语句来插入或者更新数据,这时我们直接使用一个连接对象.

>>> conn = win32com.client.dispatch(r’adodb.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 的话,必须象这样一个一个地计算他们 :

>>> # 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 # don’t 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来连接数据库,它还是应该有帮助的.

想更进一步学习的话,建议深入对象模型.下面是一些连接:
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/ado270/htm/mdmscadoobjmod.asp
http://www.activeserverpages.ru/ado/dadidx01_1.htm

(单步执行还可以,为何写为script就不行?老巫疑惑)

方法五:使用 mxodbc模块(在windows和unix下面都可以用,但是是商业化软件,要掏钱的.)下面是相关连接:

http://thor.prohosting.com/~pboddie/python/mxodbc.html

http://www.egenix.com/files/python/mxodbc.html

方法六: 对具体的数据库使用特定的python模块

mysql数据库à mysqldb模块,下载地址为:

http://sourceforge.net/projects/mysql-python

postgressql数据库àpsycopg模块

postgressql的主页为: http://www.postgresql.org

python/postgressql模块下载地址: http://initd.org/software/psycopg

oracle数据库àdcoracle模块下载地址: http://www.zope.org/products/dcoracle

àcx_oracle模块下载地址: http://freshmeat.net/projects/cx_oracle/?topic_id=809%2c66

希望本文所述对大家的python程序设计有所帮助。