Python 的数据库编程

来源:互联网 发布:excel会计记账软件 编辑:程序博客网 时间:2024/05/22 07:05

第十章  Python的数据库编程


10.1 Python环境下的数据库编程

   1、通过ODBC访问数据库

        ODBC是微软建立的一组规范,可以直接对数据库访问的应用程序接口。

        方法:开始  控制面板  管理工具  数据源  添加相应的数据库程序,最后确定完成ODBC的配置。这样在Python程序中就可以直接调用adress数据库。ODBC连接数据主要是使用odbc()对象的数据集合进行操作。

import odbc, dbi                              # 导入ODBC模块和驱动程序import timedb = odbc.odbc('addresses/scott/tiger')      # 打开数据库连接curser = db.cursor()                         # 产生cursor游标curser.execute("select * from address order by id desc")for col in curser.description:                # 显示行描述    print col[0], col[1]result = curser.fetchall()for row in result:                            # 输出各字段的值    print row    print row[1], row[2]    timeTuple = time.localtime(row[3])    print time.strftime('%Y/%m/%d', timeTuple)

5、curser 游标,它可以查询、添加、删除和修改数据库。

6、execute () 查询表address的内容。

7、description 属性  。

8、输出字段名、字段类型

9、fetchall() 方法,返回结果集对象result

10、输出表adress每行的内容。

12、输出name 、adress 字段的值。

13、localtime() 方法:把字段createtime 转换成元组

14、suftime()方法:把元组格式化为字符串输出。

2、使用DAO对象访问数据库

      DAO具有面向对象的接口,适用于小型应用程序或小范围本地使用。DAO模型是设计关系数据库系统结构的对象类的集合。Python的扩展模块win32com.client 实现了DAO的连接方式,即DAO不需要类似ODBC的配置操作,可以在Python程序中直接连接数据库。

<span style="font-size:18px;">#通过DAO方式连接ACCESS数据库addresses ,并演示DAO查询和插入等操作import win32com.clientengine = win32com.client.Dispatch("DAO.DBEngine.36")    # 实例化数据库引擎db = engine.OpenDatabase("addresses.mdb")               # 打开数据库连接rs = db.OpenRecordset("address")                        # 根据表名返回结果集对象rs = db.OpenRecordset("select * from address")          # 通过SQL语句返回数据集对象# 插入数据db.Execute("""insert into address(name, address, createtime) values('赵涛', '上海虹口', '2008-3-25')""")while not rs.EOF:                                       # 输出表address中的数据    print (rs.Fields("address").Value).encode('gb2312')    rs.MoveNext()</span>

1、该模块调用WIN32的接口访问数据库

3、代码实例化数据库引擎,返回对象engine

5,6行代码作用相同

8、Execute()方法执行插入操作

12、代码遍历结果集对象rs,如果rs中记录指针移动表address尾部,则退出循环。

13、获取字address的值,由于address字段中包含中文,故要进行编码转换。


3、使用ActiveX Date Object 访问数据库

           ADO的访问速度比DAO更快,而且支持多种数据库,例如Oracle、SQL Server 、Access、MySQL。同时,ADO可以应用于文本文件、Word、Excel 等文件类型的数据源。ADO连接方式需要设置连接字符串,连接字符串是由连接数据库的参数组成的。例,连接oracle 数据库可以表示 为:

            provider = OraOLEDB.Oracle;PLSQLRSet = 1;Password = tiger ;UserID = scott

参数Provider 表示数据源名称 ,参数PLSQLRSet表示返回PLSQL的结果集,Password 为访问数据的密码,UserID为访问数据库的账户。


<span style="font-size:18px;">#!/usr/bin/python# -*- coding: UTF-8 -*-import win32com.clientconn = win32com.client.Dispatch('ADODB.Connection')     # 实例化数据库连接对象dsn = 'Provider=OraOLEDB.Oracle;PLSQLRSet=1;Password=tiger;User ID=scott;Data Source=ORCL'conn.Open(dsn)                                          # 打开oracle数据库rs = win32com.client.Dispatch('ADODB.Recordset')sql = """select a.ename 姓名,a.job 工作,a.sal 薪水,c.dname 部门,b.ename 管理者        from emp a,emp b,dept c        where a.sal > 2500        and a.deptno = c.deptno        and a.mgr = b.empno(+)        order by a.sal"""rs.Open(sql, conn)                                      # 返回查询的结果集li = list()rs.MoveFirst()while not rs.EOF:    d = dict()    for x in range(rs.Fields.Count):                    # 把每行数据存储在一个字典中        key = rs.Fields.Item(x).Name        value = rs.Fields.Item(x).Value        d.setdefault(key, value)                        # 建立字段名和字段值的对应关系    li.append(d)                                        # 把每个字典存储在列表中    print rs.Fields("薪水").Value, rs.Fields("工作").Value, \          rs.Fields("部门").Value, rs.Fields("姓名").Value, \          rs.Fields("管理者").Value    rs.MoveNext()for d in li:                                            # 输出列表中的内容    for key in d.keys():               print key.encode("gb2312"), d.get(key),    printconn.Close()                                            # 关闭连接</span>

3、代码实例化数据库引擎,返回连接对象conn

4、oracle数据库的连接字符串

7、创建结果集对象rs

8、查询工资大于2500的员工信息

14、获取查询的结果集

15、把记录指针移动到结果集的第1行

19、遍历每行数据的字段,建立字段名和字段值的关系,并存储到1个字典中

23、把每行记录对应的字典存储到列表 中

24、输出结果集的内容  files()方法通过字段名获取字段对象。

28、遍历列表 中的每个字典,输出列表中的内容


4、python连接数据库的专用模块

      1. cx_oracle 模块  (此模块需要下载)
<span style="font-size:18px;">#!/usr/bin/python# -*- coding: UTF-8 -*-import cx_Oracleconnection = cx_Oracle.connect("scott", "tiger", "ORCL")    # 连接oracle数据库cursor = connection.cursor()                                # 获取cursor对象操作数据库cursor.arraysize = 15sql = """select a.ename 姓名,a.job 工作,a.sal 薪水,c.dname 部门,b.ename 管理者        from emp a,emp b,dept c        where a.sal > 2500        and a.deptno = c.deptno        and a.mgr = b.empno(+)        order by a.sal"""cursor.execute(sql)for x in cursor.fetchall():    for value in x:        print value,    printcursor.close()connection.close()</span>

4、创建游标对象cursor,访对象执行sql语句
12-15 返回查询的结果集,并输出结果集的内容
16、关闭游标对象
17、关闭数据库的连接

   2.MySQLdb 模块

到 http://download.mysql.cn  下载所需版本的mysql数据库。 phpMyAdmin 是一个开源的MySQL数据库管理软件,在里面创建数据库和表,并选择字符集utf8_unicode_ci。

cur.scroll ( 0 , 'absolute' )游标返回最初位置  (相对位置,绝对位置)
cursor.fetchone()  查询一条数据
cursor.fetchmany (  数据个数  )  查询多条数据

##实现Python对MySQL数据库的插入和查询操作

# -*- coding: UTF-8 -*-import os, sysimport MySQLdb# 连接数据库try:    conn = MySQLdb.connect(host='localhost',user='root',passwd='',db='ADDRESSBOOKDB')       except Exception, e:    print e    sys.exit()cursor = conn.cursor()sql = "insert into address(name, address) values (%s, %s)" values  = (("张三", "北京海淀区"), ("李四", "北京海淀区"), ("王五", "北京海淀区"))try:    cursor.executemany(sql, values)        # 插入多条数据except Exception, e:    print esql = "select * from address"cursor.execute(sql)                     # 查询数据data = cursor.fetchall()if data:    for x in data:        print x[0], x[1]cursor.close()                          # 关闭游标conn.close()                            # 关闭数据库# 转义字符函数s = "escape''"print sprint MySQLdb.escape_string(s)</span>

5、调用connect()方法连接addressesdb数据库 主机地址localhost  。返回数据库连接对象conn
6、如果数据库不存在,则抛出异常,并调用sys.exit() 中断程序的执行。
9、返回游标对象cursor
10-15、插入多条记录。
18、查询address 返回结果集data
19、判断结果集data是否为空,如果不为空,返回记录
21,输出结果集data 的内容
     

10.2 Python的持久化模块

1、用dbhash 模块读写数据 

        windows系统使用dbhash模块,UNIX系统使用gdbm模块。 
      dbhash 模块主要的方法是open()  声明:open ( filename [ , flag [ , mode ] ] )  其中,filename 为数据库名称,flag为数据库打开方式,‘w' 表示 读或写数据库 , ’r' 表示 只读方式打开,‘c'表示 创建数据库。默认方式为’r'.   dbhash模块返回值为一个字典,且字典的key value 值只支持字符串类型。
</pre><pre name="code" class="python"># windows 下 DBM数据库的读写操作  (DBM是一种文件式数据库,不具备管理能力,但比普通文件更稳定、可靠,查询速度快。)
import dbhashdb = dbhash.open('temp', 'c')               # 创建并打开数据库   返回的db对象具有字典的所有属性和方法db['Tom'] = 'Beijing road'                  # 写数据   db对象的操作方式和字典相同db['Jerry'] = 'Shanghai road'for k, v in db.iteritems():                 # 遍历db对象    print k, vif db.has_key('Tom'):                        ##判断是否存在关键字“TOM”,如果存在则删除对应的数据    del db['Tom']db['Tod'] = 2                               # 非字符串的键或值会引发异常print dbdb.close()                                  # 关闭数据库

2、 shelve 模块读写数据 

    shelve模块返回字典的value 值支持基本的python类型,如字符串、数字、也支持元组、列表和字典。用法 与dbhash模块相似。
## shelve 模块的使用方法
import shelveaddresses = shelve.open('addresses')addresses['1'] = ['Tom', 'Beijing road', '2008-01-03']addresses['2'] = ['Jerry', 'Shanghai road', '2008-03-30']addresses['3'] = 3#addresses['4'] = 0if addresses.has_key('2'):    del addresses['2']print addressesaddresses.close()

3、嵌入式数据库SQLite

      1、sqlite 的命令行工具
         SQLite是非常著名的开源嵌入式数据库。适用于桌面应用程序的数据库。 可以从www.sqlite.org 下载SQLite数据库,它提供了DOS命令行工具。  SQLite 还有许多第三方数据库客户端工具,如SQLiteManager   SQLitespy.
     2、 使用sqlite3 模块访问sqlite 数据库
         连接SQLite数据库大致可以分为以下6个步骤:
             (1) 导入sqlite3 模块
             (2) 调用connect ( ) 创建数据库连接,返回连接对象conn
             (3)调用conn.execute ( ) 方法创建表结构并插入数据。如果设置了手动提交,需要调用conn.commit()提交插入或修改数据。
              (4)调用conn.cursor() 方法返回游标,通过cur.execute (  ) 方法查询数据库
              (5)调用cur.fetchall()、cur.fetchmany ()或 cur.fetchone ()返回查询结果。
              (6)关闭cur 和conn
#!/usr/bin/python# -*- coding: UTF-8 -*-import sqlite3# 连接数据库conn = sqlite3.connect("D:/developer/python/example/10/addresses.db")# 创建表conn.execute("create table if not exists address(id integer primary key autoincrement, name varchar(128), address varchar(128))")# 插入数据conn.execute("insert into address(name, address) values ('Tom', 'Beijing road')")conn.execute("insert into address(name, address) values ('Jerry', 'Shanghai road')")# 手动提交数据conn.commit()# 获取游标对象cur = conn.cursor()# 使用游标查询数据cur.execute("select * from address")# 获取所有结果res = cur.fetchall()print "address: ", resfor line in res:    for f in line:        print f,    print# 关闭连接cur.close()conn.close()



0 0
原创粉丝点击