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


Posted in Python onJune 09, 2015

本文实例讲述了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 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;UID=monty;PWD=spam')
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程序设计有所帮助。

Python 相关文章推荐
Django中几种重定向方法
Apr 28 Python
使用Python的web.py框架实现类似Django的ORM查询的教程
May 02 Python
python实现自动重启本程序的方法
Jul 09 Python
python线程、进程和协程详解
Jul 19 Python
Python中的sort()方法使用基础教程
Jan 08 Python
pandas.DataFrame删除/选取含有特定数值的行或列实例
Nov 07 Python
Django实现一对多表模型的跨表查询方法
Dec 18 Python
Django 路由控制的实现
Jul 17 Python
python修改字典键(key)的方法
Aug 05 Python
Python实现直方图均衡基本原理解析
Aug 08 Python
python打印直角三角形与等腰三角形实例代码
Oct 20 Python
Python抓包程序mitmproxy安装和使用过程图解
Mar 02 Python
Python读写文件方法总结
Jun 09 #Python
六个窍门助你提高Python运行效率
Jun 09 #Python
python数组复制拷贝的实现方法
Jun 09 #Python
Python函数返回值实例分析
Jun 08 #Python
python下MySQLdb用法实例分析
Jun 08 #Python
Python赋值语句后逗号的作用分析
Jun 08 #Python
Python中逗号的三种作用实例分析
Jun 08 #Python
You might like
利用curl 多线程 模拟 并发的详解
2013/06/14 PHP
深入PHP数据加密详解
2013/06/18 PHP
PHP模板引擎Smarty的缓存使用总结
2014/04/24 PHP
php之curl实现http与https请求的方法
2014/10/21 PHP
PHP文件读取功能的应用实例
2015/05/08 PHP
php文件上传类完整实例
2016/05/14 PHP
php 反斜杠处理函数addslashes()和stripslashes()实例详解
2016/12/25 PHP
Json_decode 解析json字符串为NULL的解决方法(必看)
2017/02/17 PHP
php7基于递归实现删除空文件夹的方法示例
2017/06/15 PHP
用JS判别浏览器种类以及IE版本的几种方法小结
2011/08/02 Javascript
获取内联和链接中的样式(js代码)
2013/04/11 Javascript
jQuery插件开发的五种形态小结
2015/03/04 Javascript
JS实现保留n位小数的四舍五入问题示例
2016/08/03 Javascript
jQuery 生成svg矢量二维码
2016/08/09 Javascript
jQuery checkbox选中问题之prop与attr注意点分析
2016/11/15 Javascript
详解使用nodeJs安装Vue-cli
2017/05/17 NodeJs
JS实现移动端整屏滑动的实例代码
2017/11/10 Javascript
vue-router 手势滑动触发返回功能
2018/09/30 Javascript
jquery传参及获取方式(两种方式)
2020/02/13 jQuery
Python之py2exe打包工具详解
2017/06/14 Python
Python3 模块、包调用&amp;路径详解
2017/10/25 Python
python计算阶乘和的方法(1!+2!+3!+...+n!)
2019/02/01 Python
Django工程的分层结构详解
2019/07/18 Python
关于Kotlin中SAM转换的那些事
2020/09/15 Python
Python3 pyecharts生成Html文件柱状图及折线图代码实例
2020/09/29 Python
施华洛世奇澳大利亚官网:SWAROVSKI澳大利亚
2017/01/06 全球购物
eBay比利时购物网站:eBay.be
2019/08/09 全球购物
保加利亚服装和鞋类购物网站:Bibloo.bg
2020/11/08 全球购物
《愚公移山》教学反思
2014/02/20 职场文书
学雷锋树新风演讲稿
2014/05/10 职场文书
2014年保卫科工作总结
2014/12/05 职场文书
2015年党员创先争优公开承诺书
2015/04/27 职场文书
详解RedisTemplate下Redis分布式锁引发的系列问题
2021/04/27 Redis
golang 比较浮点数的大小方式
2021/05/02 Golang
SpringCloud Alibaba 基本开发框架搭建过程
2021/06/13 Java/Android
python 使用tkinter与messagebox写界面和弹窗
2022/03/20 Python