<<Python基础教程>>学习笔记 | 第13章 | 数据库支持

备注:这章内容相对介绍的比较简单,不过例子比较使用,主要是要掌握如果连接,使用数据库,并以SQLite做示例

------

Python数据库API

为了解决Python中各种数据库模块间的兼容问题,现在已经通过了一个标准的DB API。目前的API版本(2.0)定义在PEP249中的Python Database API Specification v2.0中.


异常

为了尽可能准确地处理错误,API中定义了一些异常。它们被定义在一种层次结构中,所以可以通过一个except块捕捉多种异常.


连接和游标

为了使用基础数据库系统,必须连接它。就要用到connect函数,该函数有多个参数.


connect函数返回连接对象。这个对象表示目前和数据库的会话。连接对象支持的方法如下:


rollback: 必须该数据库支持,否则不可用

commit  : 总是可用的,但是如果有的数据库不支持事务,则不起作用

cursor  : 游标对象,通过游标执行SQL查询并检查结果。游标支持的方法更多.


类型:

数据库对插入到具有某种类型的列中的值有不同的要求,是为了能正确与基础SQL数据库进行交互操作.

下面以sqlite3模块为例:


SQLite和PySQLite

这里选择了小型数据库引擎SQLite,不需要作为独立的服务器运行,并且不基于集中式数据库存储机制,而是直接作用于本地文件. 从Python 2.5开始, SQLite的优势在于它的一个包装PySQLite已经包括在数据库内,不需要单独安装. SQLite网站下载源码: http://sqlite.org 

------

入门:

#导入模块

>>>import sqlite3

#建立连接,文件不存在则会创建

>>>conn = sqlite3.connect(‘test.db‘)

#获得连接的游标

>>>curs = conn.cursor()

#提交事务,这样操作才会保留在本地

>>>conn.commit()

#关闭数据库

>>>conn.close()

------

示例: 

准备数据:将网站:http://www.ars.usda.gov/nutrientdata主页上点击USDA National Nutrient Database for Standard Reference链接,ASCII保持的zip数据文件,保留到本地,ABBREV.txt文件,格式大致如下:

~23451~^~BEEF,NZ,IMP,BRISKET POINT END,LN & FAT,RAW~^70.11^

~23452~^~BEEF,NZ,IMP,CHUCK EYE ROLL,LN & FAT,CKD,BRSD~^55.95^

字段以^进行分割,数字字段包含数字,而文本段包括~的字符串值.可以用line.split(‘^‘)将一行文字解析为多个字段。对于其他的数字字段,使用float(field).下面是完整的脚本及输出结果:

  • 代码清单1: 将数据导入本地数据库

import sqlite3

def convert(value):
    if value.startswith('~'):
        return value.strip('~')
    if not value:
        value = '0'
    return float(value)


conn = sqlite3.connect('food.db')
curs = conn.cursor()


curs.execute('''
CREATE TABLE food(
id          TEXT PRIMARY KEY,
desc        TEXT,
water       FLOAT,      
kcal        FLOAT,
protein     FLOAT,
fat         FLOAT,
ash         FLOAT,
carbs       FLOAT,
fiber       FLOAT,
sugar       FLOAT
)
    ''')

query = 'INSERT INTO food VALUES(?,?,?,?,?,?,?,?,?,?)'
 
for line in open('ABBREV.txt'):
    fields = line.split('^')
    vals   = [convert(f) for f in fields[:10]]
    curs.execute(query,vals)

conn.commit()
conn.close()
  • 代码清单2: 食品数据库查询程序
import sqlite3,sys

conn = sqlite3.connect('food.db')
curs = conn.cursor()

query = 'SELECT * FROM food WHERE %s' % sys.argv[1]
print query
curs.execute(query)

names = [f[0] for f in curs.description]
for row in curs.fetchall():
    for pair in zip(names,row):
        print '%s: %s' % pair
    print
输出结果:

+++++++++++++++++++++++++++++++++++++++++++++++++

d:\>python food_query.py id

id: 23449
desc: BEEF,NZ,IMP,BRISKET NAVAL END,LN & FAT,RAW
water: 53.33
kcal: 345.0
protein: 15.81
fat: 31.27
ash: 0.61
carbs: 0.0
fiber: 0.0
sugar: 0.0

id: 23450
desc: BEEF,NZ,IMP,BRISKET POINT END,LN & FAT,CKD,BRSD
water: 54.66
kcal: 250.0
protein: 31.94
fat: 13.6
ash: 0.78
carbs: 0.0
fiber: 0.0
sugar: 0.0

+++++++++++++++++++++++++++++++++++++++++++++++++

d:\>python food_query.py "kcal<=100 AND fiber >=0 ORDER BY sugar"

id: 09512
desc: GRAPE JUC,CND OR BTLD,W/ ADDED VIT C & CA
water: 84.51
kcal: 62.0
protein: 0.37
fat: 0.13
ash: 0.22
carbs: 14.77
fiber: 0.2
sugar: 14.2





郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。