1 数据持久化

  持久化是将内存中的对象存储在关系数据库中,当然也可以存储在磁盘文件、XML数据文件中。实现数据持久化至少需要实现以下3个接口

  1. void Save(object o):把一个对象保存到外存中
  2. Object Load(object oid):通过对象标识从外存中取回对象
  3. bool Exists(object oid):检查外存中是否存在某个对象

  凡是可以序列化的对象可以持久化。序列化需要实现如下两个接口:

  1. void Serialize(Stream stream, object o)
  2. object Deserialize(Stream stream):将流反序列化成对象

  序列化是为了解决对象的传输问题,序列化可以辅助持久化。

2 Python的数据库支持

  在python中,可以使用的关系数据库又PostgreSQL、MySQL、SQLite等,为了连接数据库,需要使用connect函数。该函数有多个参数,根据连接的数据库不同而选择不同的参数。

  1. connect 函数中的常用参数
  2. dsn 数据源名称
  3. user 连接数据库的用户名
  4. password 连接数据库的密码
  5. host 主机名
  6. database 连接数据库的名称

  使用connect函数返回一个连接对象,该对象表示目前和数据库的会话,接下来就可以使用该对象的方法来对数据库中的数据进行操作。

2.1 connect连接对象的方法

  1. close:关闭连接之后,连接对象和游标都不能用
  2. commit:如果支持该方法,就会提交挂起的事务,否则没有任何作用
  3. rollback:回滚挂起的事务
  4. cursor:返回一个连接的游标对象

2.2 游标对象的方法

2.3 数据库编程支持模块

  Python提供了几种持久化模块,这些模块可以模拟数据库的操作,将数据保存到指定的文件中。如dbhash、shelve、anydbm等模块。
1.使用dbhash模块读写数据
  python标准化提供的持久化模块,可以模拟数据库操作,将数据保存到指定的文件中,这个指定的文件可以是DBM数据库。DBM是一种文件式数据库,采用哈希结构进行存储,它并不具备管理能力,但会比普通文件稳定、可靠,并且查询速度快。不同操作系统需要使用不同的python模块来实现DBM数据库,windows系统主要使用dbhash模块。dbhash模块的主要方法就是open,格式如下:
open(filename,flag)
  上述语法中,filename表示数据库名称,flag表示数据库的打开方式,具体说有如下情况:w表示读或写数据库,r表示只读,c表示创建数据库,默认为r

  1. #-*- coding:UTF-8 -*-
  2.  
  3. '''
  4. Created on 2013-8-8
  5.  
  6. @author: Landau
  7. '''
  8. import os
  9. import dbhash
  10. #打开一个文件数据库,如果数据库不存在,则自动创建
  11. db = dbhash.open("mydb", "c")
  12. db["Amy"] = "beautiful"
  13. db["Jack"] = "Handsome"
  14. db["AiQi"] = "Cute"
  15. print "--------没有进行任何操作的数据----------"
  16. for k, v in db.iteritems():
  17. print k, v
  18. db.close()
  19. 输出结果:
  20. --------没有进行任何操作的数据----------
  21. AiQi Cute
  22. Amy beautiful
  23. Jack Handsome

  上面的数据库类似字典对象

  需要注意的是,dbhash模块的文件系统仅支持字符串类型的值,也就是db["Amy"] = 13是非法的。只能是字符串。我们可以用下面介绍的shelve模块来解决
2.使用shelve模块读写数据
shelve模块和python类似,但是shelve模块返回的字典类型可以支持python中的基本类型,例如字符串、数字、元组及列表等。同样shelve也有open方法。
open(filename)
在上述语法中,filename表示数据库的名称,如果数据库不存在,则创建该数据库。

  1. import shelve
  2. db = shelve.open("mydb1")
  3. db["Amy"] = ["Amy", "", "Gelunbia", 3000]
  4. db["Lily"] = ["Lily", "", "Gelunbia", 3500]
  5. db["Quinta"] = ["Quinta", "", "Gelunbia", 3800]
  6. db["Fei"] = ["Fei", "", "Gelunbia", 3900]
  7. print db
  8. db.close()

输出结果:

  1. {'Amy': ['Amy', '', 'Gelunbia', 3000], 'Quinta': ['Quinta', '', 'Gelunbia', 3800], 'Lily': ['Lily', '', 'Gelunbia', 3500], 'Fei': ['Fei', '', 'Gelunbia', 3900]}

  shelve模块返回字典的key值只能是字符串类型,如果是其他类型,则会引发异常。

  anydbm模块和dbhash模块使用方法类似,几乎没区别。

3.连接第三方数据库

  这里以SQLite为例

数据库连接对象

conn = sqlite3.connect("userDB.db")
  返回一个数据库连接对象,有如下几种操作。

  1. commit 提交事务
  2. rollback 事务回滚
  3. close 关闭一个数据库连接
  4. cursor 创建一个游标

游标

  数据库连接成功之后,需要对SQL语句进行操作,这里所有的SQL语句都需要在游标对象下进行,创建游标对象代码如下:

cur = conn.cursor()
游标对象的一些操作

  1. execute 执行一条SQL语句
  2. executemany 执行多条SQL语句
  3. close 关闭游标
  4. fetchone 从结果中取出一条记录
  5. fetchmany 从结果中取出多条记录
  6. fetchall 取出所有记录
  7. scroll 游标滚动

  下面介绍连接SQLite数据库步骤:

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
一个例子:

  1. #导入sqlite3包
  2. import sqlite3;
  3. #连接数据库,如果不存在,则创建
  4. conn = sqlite3.connect("userDB.db")
  5. conn.execute("create table if not exists address (id integer primary key autoincrement, name varchar(128), address varchar(128))")
  6. conn.execute("insert into address(name,address) values('QiQi', 'WuHu')")
  7. conn.execute("insert into address(name,address) values('DaTou', 'Luan')")
  8. conn.commit()
  9. #创建一个数据库连接对象游标
  10. cur = conn.cursor()
  11. cur.execute("select * from address")
  12. res = cur.fetchall()
  13. print "address:", res
  14. for line in res:
  15. for f in line:
  16. print f
  17. cur.close()
  18. conn.close()
  19. 输出结果:
  20. address: [(1, u'QiQi', u'WuHu'), (2, u'DaTou', u'Luan')]
  21. 1
  22. QiQi
  23. WuHu
  24. 2
  25. DaTou

注意:在上面插入数据库语句中,字段值不能用双引号,否则会报错。
ps:游标是什么
  游标(cursor)是系统为用户开设的一个数据缓冲区,存放SQL语句的执行结果。每个游标区都有一个名字。用户可以用SQL语句逐一从游标中获取记录,并赋给主变量,交由主语言进一步处理。游标本身并不是什么很玄的东西,提出游标概念的目的是为了对查询结果集进行各种处理。

Python程序设计9——数据库编程的更多相关文章

  1. Python程序设计8——网络编程

    Python是一个很强大的网络编程工具,python内有很多针对场景网络协议的库,在库顶部可以获得抽象层,这样就可以集中精力在程序的逻辑处理上,而不是停留在网络实现的细节中. 1 少数几个网络设计模块 ...

  2. 运用Python语言编写获取Linux基本系统信息(三):Python与数据库编程,把获取的信息存入数据库

    运用Python语言编写获取Linux基本系统信息(三):Python与数据库编程 有关前两篇的链接: 运用Python语言编写获取Linux基本系统信息(一):获得Linux版本.内核.当前时间 运 ...

  3. Python学习系列(七)( 数据库编程)

    Python学习系列(七)( 数据库编程)        Python学习系列(六)(模块) 一,MySQL-Python插件       Python里操作MySQL数据库,需要Python下安装访 ...

  4. python 闯关之路四(下)(并发编程与数据库编程) 并发编程重点

    python 闯关之路四(下)(并发编程与数据库编程)   并发编程重点: 1 2 3 4 5 6 7 并发编程:线程.进程.队列.IO多路模型   操作系统工作原理介绍.线程.进程演化史.特点.区别 ...

  5. python 教程 第二十章、 数据库编程

    第二十章. 数据库编程 环境设置 1).安装MySQL-python http://www.lfd.uci.edu/~gohlke/pythonlibs/ MySQL-python-1.2.3.win ...

  6. Python程序设计试验报告一: 熟悉IDLE和在线编程平台

    安徽工程大学 Python程序设计 实验报告                                                                  班级   物流192   ...

  7. Python程序设计实验报告一:熟悉IDLE和在线编程平台

    安徽工程大学 Python程序设计 实验报告 班级   物流191   姓名  崔攀  学号3190505136 成绩_____           日期     2020.3.8     指导老师  ...

  8. Python程序设计 实验 1 熟悉 IDLE 和在线编程平台

    ------------恢复内容开始------------ 安徽工程大学 Python程序设计 实验报告 班级   物流191   姓名  姚彩琴  学号3190505129 成绩 日期     2 ...

  9. python之数据库编程

    python之数据库编程 sqlite 1.前期准备工作 导入模块: import sqlite3 连接数据库 conn = sqlite3.connect("test.db") ...

随机推荐

  1. listening 1

    It was regrettable that such great issues had to be the thrust and parry of a general election. But ...

  2. SQL-主键与外键

    1.PRIMARY KEY 主键,唯一标识一行或多行,不允许重复值,也不允许未NULL. 语法:[CONSTRAINT <约束名>] PRIMARY KEY [(列名1,列名2...)] ...

  3. 如何用visual studio2013编写简单C语言程序

    vc++6.0 作为经典版本,虽然已经几乎淘汰,但还是有很多的初学者在使用.但当他们使用vs2013时会发现界面和操作和vc++6.0有了极大的不同,不知该如何 操作.随着vs2013的普及,更多人使 ...

  4. UVA - 1471 Defense Lines (set/bit/lis)

    紫薯例题+1. 题意:给你一个长度为n(n<=200000)的序列a[n],求删除一个连续子序列后的可能的最长连续上升子序列的长度. 首先对序列进行分段,每一段连续的子序列的元素递增,设L[i] ...

  5. maven module开发 自动打包

    http://blog.csdn.net/u011113713/article/details/52413903 http://blog.csdn.net/sisyphus_z/article/det ...

  6. vue切换样式

    在vue中使用事件来切换绑定的class样式,在vue-cli脚手架中的Home.vue中 <template> <div id="main"> <l ...

  7. css3 flex布局/grid布局

    1.CSS3 Flexbox 布局完全指南(图解 Flexbox 布局详细教程) 2.CSS Grid 布局完全指南(图解 Grid 详细教程)

  8. 开始写博客,与ITer们互相学习

    学习计算机也6年了,一直待在学校里.这些年来很多学习资料都来自网络上的技术博客,非常感谢各位 ITer 的分享精神,鄙人从中受益匪浅.从今天起也挤出时间开始写技术博客.主要是把自己这些年的一些技术文档 ...

  9. bzoj 3629 [JLOI2014]聪明的燕姿——约数和定理+dfs

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=3629 如果要搜索,肯定得质因数分解吧:就应该朝这个方向想. **约数和定理: 对于任意一个大 ...

  10. 数据库:sql 多表联合更新【转】

    SQL Update多表联合更新的方法 (1) sqlite 多表更新方法 update t1 set col1=t2.col1 from table1 t1 inner join table2 t2 ...