Python程序设计9——数据库编程
1 数据持久化
持久化是将内存中的对象存储在关系数据库中,当然也可以存储在磁盘文件、XML数据文件中。实现数据持久化至少需要实现以下3个接口
void Save(object o):把一个对象保存到外存中
Object Load(object oid):通过对象标识从外存中取回对象
bool Exists(object oid):检查外存中是否存在某个对象
凡是可以序列化的对象可以持久化。序列化需要实现如下两个接口:
void Serialize(Stream stream, object o)
object Deserialize(Stream stream):将流反序列化成对象
序列化是为了解决对象的传输问题,序列化可以辅助持久化。
2 Python的数据库支持
在python中,可以使用的关系数据库又PostgreSQL、MySQL、SQLite等,为了连接数据库,需要使用connect函数。该函数有多个参数,根据连接的数据库不同而选择不同的参数。
connect 函数中的常用参数
dsn 数据源名称
user 连接数据库的用户名
password 连接数据库的密码
host 主机名
database 连接数据库的名称
使用connect函数返回一个连接对象,该对象表示目前和数据库的会话,接下来就可以使用该对象的方法来对数据库中的数据进行操作。
2.1 connect连接对象的方法
close:关闭连接之后,连接对象和游标都不能用
commit:如果支持该方法,就会提交挂起的事务,否则没有任何作用
rollback:回滚挂起的事务
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
#-*- coding:UTF-8 -*- '''
Created on 2013-8-8 @author: Landau
'''
import os
import dbhash
#打开一个文件数据库,如果数据库不存在,则自动创建
db = dbhash.open("mydb", "c")
db["Amy"] = "beautiful"
db["Jack"] = "Handsome"
db["AiQi"] = "Cute"
print "--------没有进行任何操作的数据----------"
for k, v in db.iteritems():
print k, v
db.close()
输出结果:
--------没有进行任何操作的数据----------
AiQi Cute
Amy beautiful
Jack Handsome
上面的数据库类似字典对象
需要注意的是,dbhash模块的文件系统仅支持字符串类型的值,也就是db["Amy"] = 13是非法的。只能是字符串。我们可以用下面介绍的shelve模块来解决
2.使用shelve模块读写数据
shelve模块和python类似,但是shelve模块返回的字典类型可以支持python中的基本类型,例如字符串、数字、元组及列表等。同样shelve也有open方法。
open(filename)
在上述语法中,filename表示数据库的名称,如果数据库不存在,则创建该数据库。
import shelve
db = shelve.open("mydb1")
db["Amy"] = ["Amy", "", "Gelunbia", 3000]
db["Lily"] = ["Lily", "", "Gelunbia", 3500]
db["Quinta"] = ["Quinta", "", "Gelunbia", 3800]
db["Fei"] = ["Fei", "", "Gelunbia", 3900]
print db
db.close()
输出结果:
{'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")
返回一个数据库连接对象,有如下几种操作。
commit 提交事务
rollback 事务回滚
close 关闭一个数据库连接
cursor 创建一个游标
游标
数据库连接成功之后,需要对SQL语句进行操作,这里所有的SQL语句都需要在游标对象下进行,创建游标对象代码如下:
cur = conn.cursor()
游标对象的一些操作
execute 执行一条SQL语句
executemany 执行多条SQL语句
close 关闭游标
fetchone 从结果中取出一条记录
fetchmany 从结果中取出多条记录
fetchall 取出所有记录
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
一个例子:
#导入sqlite3包
import sqlite3;
#连接数据库,如果不存在,则创建
conn = sqlite3.connect("userDB.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('QiQi', 'WuHu')")
conn.execute("insert into address(name,address) values('DaTou', 'Luan')")
conn.commit()
#创建一个数据库连接对象游标
cur = conn.cursor()
cur.execute("select * from address")
res = cur.fetchall()
print "address:", res
for line in res:
for f in line:
print f
cur.close()
conn.close()
输出结果:
address: [(1, u'QiQi', u'WuHu'), (2, u'DaTou', u'Luan')]
1
QiQi
WuHu
2
DaTou
注意:在上面插入数据库语句中,字段值不能用双引号,否则会报错。
ps:游标是什么
游标(cursor)是系统为用户开设的一个数据缓冲区,存放SQL语句的执行结果。每个游标区都有一个名字。用户可以用SQL语句逐一从游标中获取记录,并赋给主变量,交由主语言进一步处理。游标本身并不是什么很玄的东西,提出游标概念的目的是为了对查询结果集进行各种处理。
Python程序设计9——数据库编程的更多相关文章
- Python程序设计8——网络编程
Python是一个很强大的网络编程工具,python内有很多针对场景网络协议的库,在库顶部可以获得抽象层,这样就可以集中精力在程序的逻辑处理上,而不是停留在网络实现的细节中. 1 少数几个网络设计模块 ...
- 运用Python语言编写获取Linux基本系统信息(三):Python与数据库编程,把获取的信息存入数据库
运用Python语言编写获取Linux基本系统信息(三):Python与数据库编程 有关前两篇的链接: 运用Python语言编写获取Linux基本系统信息(一):获得Linux版本.内核.当前时间 运 ...
- Python学习系列(七)( 数据库编程)
Python学习系列(七)( 数据库编程) Python学习系列(六)(模块) 一,MySQL-Python插件 Python里操作MySQL数据库,需要Python下安装访 ...
- python 闯关之路四(下)(并发编程与数据库编程) 并发编程重点
python 闯关之路四(下)(并发编程与数据库编程) 并发编程重点: 1 2 3 4 5 6 7 并发编程:线程.进程.队列.IO多路模型 操作系统工作原理介绍.线程.进程演化史.特点.区别 ...
- python 教程 第二十章、 数据库编程
第二十章. 数据库编程 环境设置 1).安装MySQL-python http://www.lfd.uci.edu/~gohlke/pythonlibs/ MySQL-python-1.2.3.win ...
- Python程序设计试验报告一: 熟悉IDLE和在线编程平台
安徽工程大学 Python程序设计 实验报告 班级 物流192 ...
- Python程序设计实验报告一:熟悉IDLE和在线编程平台
安徽工程大学 Python程序设计 实验报告 班级 物流191 姓名 崔攀 学号3190505136 成绩_____ 日期 2020.3.8 指导老师 ...
- Python程序设计 实验 1 熟悉 IDLE 和在线编程平台
------------恢复内容开始------------ 安徽工程大学 Python程序设计 实验报告 班级 物流191 姓名 姚彩琴 学号3190505129 成绩 日期 2 ...
- python之数据库编程
python之数据库编程 sqlite 1.前期准备工作 导入模块: import sqlite3 连接数据库 conn = sqlite3.connect("test.db") ...
随机推荐
- Codeforces Round #286 (Div. 2)A. Mr. Kitayuta's Gift(暴力,string的应用)
由于字符串的长度很短,所以就暴力枚举每一个空每一个字母,出现行的就输出.这么简单的思路我居然没想到,临场想了很多,以为有什么技巧,越想越迷...是思维方式有问题,遇到问题先分析最简单粗暴的办法,然后一 ...
- spark 稠密向量和稀疏向量
Spark mlib的本地向量有两种: DenseVctor :稠密向量 其创建方式 Vector.dense(数据) SparseVector :稀疏向量 其创建方式有两种: 方法一 ...
- Python 2.7_爬取CSDN单页面利用正则提取博客文章及url_20170114
年前有点忙,没来的及更博,最近看爬虫正则的部分 巩固下 1.爬取的单页面:http://blog.csdn.net/column/details/why-bug.html 2.过程 解析url获得网站 ...
- jraiser模块加载执行简要总结
1 在html文件中,通过require方式来加载指定的入口文件:2 然后通过正则表达式来匹配入口文件中的所有require的依赖文件:注意,此时入口文件已加载完毕,不过,还没执行而已.3 之后逐一通 ...
- Operating System-进程/线程内部通信-管程(Monitor)介绍,实现以及应用
本文主要内容: 管程(Monitor)介绍 管程实现 管程应用 一.管程(Monitor)介绍 1.1 管程 前一篇文章介绍了信号量以及使用,信号量已经提供了一个方便且高效的进程同步机制,但是信号量有 ...
- 【HTML代码】访问页面时,拨打页面中的电话号码
这两天在写HTML页面今天要实现一个手机用户访问页面的时候,如果页面中有电话号码,点击可以打电话或者是发信息,之前没做过今天刚听说感觉很高大上会很难,实际上简单的让我内牛满面啊,, 小婊砸 (* ...
- java代码。。重温JPassword,JLabel,JPanel
package com.kk; //JPasswordField类的使用 import java.awt.Color; import java.awt.FlowLayout; import javax ...
- PV 和 UV IP
PV(page view),即页面浏览量,或点击量;通常是衡量一个网络新闻频道或网站甚至一条网络新闻的主要指标. 高手对pv的解释是,一个访问者在24小时(0点到24点)内到底看了你网站几个页面.这里 ...
- AngularJS:事件
ylbtech-AngularJS:事件 1.返回顶部 1. AngularJS 事件 AngularJS 有自己的 HTML 事件指令. ng-click 指令 ng-click 指令定义了 Ang ...
- SA读书笔记1
SA的基本任务: 帐户: 为新用户增设帐号,将不再活动的帐号删除,帐号存活期事务(忘记密码等).把用户的主目录放在什么位置.在哪些机器上创建帐号. 硬件:识别并使用新硬件.对于虚拟化:设备可能要安装在 ...