使用数据库的好处:
a、支持数据的并发访问,多个用户同时对基于磁盘的数据进行读写而不造成任何文件的损坏;
b、支持根据多个数据字段或属性进行复杂的搜索;
1、如何操作数据库,API
数据库的种类有很多,并且它们的功能基本都是一样的,为了对数据库进行统一的操作,大多数语言都提供了简单的、标准化的数据库接口(API)。为了易于编写跨数据库的程序,所有数据库的包装模块都应当遵循这个接口。
2、支持的API函数
连接数据库connect(),该函数返回连接对象,代表了与要连接的数据库的会话。连接对象支持一下方法:
close() | 关闭连接之后,连接对象和它的游标均不可用 |
commit() | 如果支持的话提交挂起的事务,否则不做任何事 |
rollback() | 回滚挂起的事务 |
cursor() | 返回连接的游标对象(通过游标对象执行SQL查询并检查结果,结果行可以一个一个地获得,也可以很多个一起获得) |
游标对象的方法:
callproc(name[,params]) | 使用给定的名称和参数(可选)调用已命名的数据库程序 |
close() | 关闭游标之后,游标不可用 |
execute(oper[,params]) | 执行SQL参数,可能使用参数 |
executemany(opr, pseq) | 对序列中的每个参数执行SQL操作 |
fetchone() | 把查询的结果集中的下一行保存为序列,或者None |
fetchmany([size]) | 获取查询结果集中的多行,默认尺寸为arraysize |
fetchall() | 以序列的形式获取结果集中的所有行 |
nextset() | 跳至下一个可用的结果集(可选) |
setinputsizes(sizes) | 为参数预先定义内存区域 |
setoutputsize(size[,col]) | 为获取的大数据值设定缓冲区尺寸 |
游标对象特性:
description | 结果列描述的系列,只读 |
rowcount | 结果中的行数,只读 |
arraysize | fetchmany中返回的行数,默认为1 |
3、程序示例
以SQLite数据库为例,它是小型的嵌入式SQL数据库,它的python包装叫做PYSQLite。它速度快,易于使用,并且不需要建立单独的服务器。
3.1 创建和填充表
1 import sqlite 2 3 def convert(value): 4 if value.startswith('~'): 5 return value.strip('~') 6 if not value: 7 value = '0' 8 return float(value) 9 10 conn = sqlite.connect('food.db') 11 curs = conn.cursor() 12 13 curs.execute(''' 14 CREATE TABLE food ( 15 id TEXT PRIMARY KEY, 16 desc TEXT, 17 water FLOAT, 18 kcal FLOAT, 19 protein FLOAT, 20 fat FLOAT, 21 ash FLOAT, 22 carbs FLOAT, 23 fiber FLOAT, 24 sugar FLOAT 25 ) 26 ''') 27 28 field_count = 10 29 markers = ', '.join(['%s']*field_count) 30 query = 'INSERT INTO food VALUES (%s)' % markers 31 32 for line in open('ABBREV.txt'): 33 fields = line.split('^') 34 vals = [convert(f) for f in fields[:field_count]] 35 curs.execute(query, vals) 36 37 conn.commit() 38 conn.close()
3.2 搜索和处理结果
1 import sqlite, sys 2 3 conn = sqlite.connect('food.db') 4 curs = conn.cursor() 5 6 query = 'SELECT * FROM food WHERE %s' % sys.argv[1] 7 print query 8 curs.execute(query) 9 names = [f[0] for f in curs.description] 10 for row incurs.fetchall(): 11 for pair in zip(names, row): 12 print '%s: %s' % pair 13 print