【循序渐进学Python】14.数据库的支持
纯文本只能够实现一些简单有限的功能。如果想要实现自动序列化,也可以使用 shelve 模块和 pickle 模块来实现。但是,如果想要自动的实现数据并发访问,以及更标准,更通用的数据库(database)存储方式还是使用数据库。
1. Python 数据库 API
很多支持SQL标准的数据库在Python中都有对应的客户端模块。为了在提供相同功能(基本相同)的不同模块之间进行切换(兼容),Python 规定了一个标准的 DB API。目前API最新版本时 2.0,具体可以参考这里:http://www.python.org/dev/peps/pep-0249/。
1.1 全局变量
任何支持2.0版本的DB API的数据库模块都定义了3个描述模块特性的全局变量:
apilevel 所使用的Python DB API版本
threadsafety 模块的线程安全级别
paramstyle 在SQL查询中使用的参数风格
apilevel 是个字符串常量,提供正在使用API的版本号,对于DB API 2.0 版本来说
- 值可能是 ‘1.0’,
- 也可能是 ‘2.0’;
threadsafety 这这只有在使用多线程时才有参考价值,取值范围为0~3的整数。
- 0 表示完全不共享模块
- 1 表示线程本身可以共享模块,但不对连接共享
- 3 表示模块完全是线程安全的
paramstyle 表示在执行多次类似查询的时候,参数是如何被拼接到SQL查询中的:
- 'format'表示标准的字符串格式化
- 'pyformat'表示扩展的格式代码,使用字典拼接
- 'qmark'表示使用问号
- 'numberic'表示使用 :1 或 :2 格式的字段
- 'named’表示使用 :name 格式的字段
1.2 异常
API中定义了(层次结构)一些异常类,可以通过 except 块捕捉多种异常。如果想要知道更多DB API异常的想想可以参考这里:http://www.python.org/dev/peps/pep-0249/#exceptions,下面是DB API中使用的异常:
===============================================================================
异常 超类 描述
===============================================================================
StandarError 所有异常的泛型基类
Waring StandarError 在非致命错误发生时引发
Error StandarError 所有错误条件的泛型超类
InterfaceError Error 关于接口而非数据库的错误
DatabaseError Error 与数据库相关的错误的基类
DataError DatabaseError 与数据库相关的问题,比如值超出范围
OperationalError DatabaseError 数据库内部操作错误
IntegrityError DatabaseError 关系完整性受到影响,比如键检查失败
InternalError DatabaseError 数据库内部错误,比如非法游标
ProgramningError DatabaseError 用户编程错误,比如未找到表
NotSupportedError DatabaseError 请求不支持的特性(比如回滚)
1.3 连接和游标
使用 connect 函数连接到数据库,该函数有多个参数,具体使用方法取决于对应的数据库。下面是具体的参数含义(使用时推荐使用关键字参数的方式):
==================================================
参数名 描述
==================================================
dsn 数据库源名称,给出参数表示数据库依赖(必选)
user 用户名(可选)
passowrd 密码(可选)
host 主机名(可选)
database 数据库名(可选)
函数返回连接对象,该对象表示目前和数据库的会话,对象支持的方法如下:
=============================================================
方法名 描述
=============================================================
close() 关闭连接之后,连接对象和它的游标均不可用
commit() 如果支持的话就提交挂起事务,否则不可用
rollback() 回滚挂起的事务
cursor() 返回连接的游标对象
rollback 方法如果使用的数据库支持的话,就会撤销所有未提交的事务。而 cursor 方法则返回一个游标对象,可以通过游标执行SQL查询并检查结果。游标比连接支持更多方法,也更加易用,下面是游标方法的概述:
====================================================================================
名称 描述
====================================================================================
callproc(name[, params]) 使用给定的名称和参数(可选)调用以命名的数据库程序
close() 关闭游标后,游标不可用
execute(oper[, params]) 执行SQL操作,可选的参数
executemany(oper, pseq) 对序列中的每个参数执行SQL操作
fetchone() 把查询结果集中的下一行保存为序列或者None
fetchmany([size]) 获取查询的结果集中的多行,默认尺寸为arraysize
fetchall() 将所有(剩余)的行作为序列的序列
nextset() 跳至下一个可用的结果集(可选)
setinputsizes(sizes) 为参数预先定义的内存区域
setoutputsize(size[, col]) 为获取的大数据库值设定缓冲区尺寸
游标对象还包含一些特性:
==================================================
名称 描述
==================================================
description 结果列描述的序列,只读
rowcount 结果中的行数,只读
arraysize fetchmany中返回的行数,默认为1
1.4 类型
DB API 定义了Python中的类型和数据库类型的对应关系。通过特殊的类型和值的构造函数以及常量(单例模式),如下(一些模块可能并不是完全按照这些定义):
==================================================
名称 描述
==================================================
Date(year, month, day) 创建保存日期值的对象
Time(hour, minute, second) 创建保存时间值的对象
Timestamp(y, mon, d, h, min, s) 创建保存时间戳的对象
DateFromTicks(ticks) 创建保存自新纪元以来的秒数的对象
TimeFromTicks(ticks) 创建保存来自秒数的时间值的对象
TimestampFromTicks(ticks) 创建保存来自秒数的时间戳值的对象
Binary(string) 创建保存二进制字符串值的对象
STRING 描述二进制列(比如LONG或RAW)
BINARY 描述数字列
MUMBER 描述数字列
DATETIME 描述日期/时间列
ROWID 描述行ID列
2. SQLite 和PySQLite
SQLite是一个小型的数据库引擎,它不基于集中式数据库存储机制,而是直接作用于本地文件。在Python 2.5 之后,SQLite 的包装(PySQLite)已经被包含在标准库中了(在最新的Python版本中已经包含了SQLite数据库了,并不需要单独安装)。
2.1 简单示例
将SQLite作为名为sqlite3的模块导入,即可创建一个数据库文件(不存在则创建,可指定路径),并连接到数据库,下面是一个简单的示例:
# -- coding:utf-8 --
import sqlite3
conn = sqlite3.connect('myDatabase.db')
curs = conn.cursor() # 获得游标
conn.commit() # 提交更改
conn.close() # 关闭连接
2.2 创建和填充表
通过下面的示例来学习如果创建和向表中插入数据,在这里使用的数据库是基于USDA营养数据库实验室提供的文本格式的数据库,在这里使用的文件地址是:http://sr23-nutrient-calculator.googlecode.com/svn-history/r9/trunk/ABBREV.txt,示例如下:
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 = r'INSERT INTO food VALUES(?,?,?,?,?,?,?,?,?,?)'
for line in open('ABBREV.txt'):
fields = line.split('^')
vals = [convert(f) for f in fields[0:10]]
curs.execute(query,vals)
conn.commit()
conn.close()
2.3 搜索和处理结果
查询数据库内容只需要创建连接,并获得该连接的游标即可,通过 execute 方法执行SQL查询,使用 fetchall 等方法提取结果,如下所示:
# food_query.py
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
运行程序,通过命令行传递查询参数:
python food_query.py "kcal <=100 AND fiber >= 10 ORDER BY sugar"
参考资料&进一步阅读
【循序渐进学Python】14.数据库的支持的更多相关文章
- 【循序渐进学Python】15.网络编程
Python 内置封装了很多常见的网络协议的库,因此Python成为了一个强大的网络编程工具,这里是对Python的网络方面编程的一个简单描述. 1. 常用的网络设计模块 在标准库中有很多网络设计相关 ...
- 【循序渐进学Python】12.Python 正则表达式简介
正表达式就是一段匹配文本片段的模式,在Python 中 re 模块包含了对正则表达式(regular expression)的支持. 1. 正则表达式的基本概念 1. 通配符 点号( . )可以匹配换 ...
- 【循序渐进学Python】11.常用标准库
安装完Python之后,我们也同时获得了强大的Python标准库,通过使用这些标准库可以为我们节省大量的时间.这里是一些常用标准库的简单说明.更多的标准库的说明,可以参考Python文档 sys 模块 ...
- 【循序渐进学Python】7.面向对象的核心——类型(上)
我们知道Python是一门面向对象的脚本语言.从C#的角度来看:首先Python支持多继承.Python 类型成员通常都是public的,并且所有成员函数都是virtual的(可以直接重写). 1. ...
- 【循序渐进学Python】3. Python中的序列——字符串
字符串是零个或多个的字符所组成的序列,字符串是Python内建的6种序列之一,在Python中字符串是不可变的. 1. 格式化字符串 字符串格式化使用字符串格式化操作符即百分号%来实现.在%左侧放置一 ...
- 【循序渐进学Python】2. Python中的序列——列表和元组
序列概览 在Python中有六种内建的序列:列表.元组.字符串.Unicode字符串.buffer对象和xrange对象.在这里暂时只讨论列表和元组.列表和元组的主要区别在于:列表可以修改,元组(不可 ...
- 【循序渐进学Python】13.基本的文件I/O
文件I/O是Python中最重要的技术之一,在Python中对文件进行I/O操作是非常简单的. 1. 打开文件 使用 open 函数来打开文件,语法如下: open(name[, mode[, buf ...
- 【循序渐进学Python】10.模块和包
1.导入模块 任何Python程序都可以作为模块导入,只要Python解释器能找到我们定义的模块所在位置即可,一般来讲,在一个模块被导入时,Python解释器会按照下面的步骤进行搜索: 在当前所在目录 ...
- 【循序渐进学Python】9.异常处理
1. 抛出异常和自定义异常 Python用异常对象(exception object)表示异常情况,遇到错误后,会引发异常.如果异常对象并未被处理或捕捉,程序就会用所谓的回溯(Traceback,一种 ...
随机推荐
- TSql Top 用法
第一部分:TSql Top 有两种用法 1,限制查询结果集返回的行数或总行数的百分比. 当将 TOP 与 ORDER BY 子句结合使用时,结果集限制为前 N 个已排序行:否则,以未定义的顺序返回前 ...
- Create New Commands in Tcl
Create New Commands in Tcl eryar@163.com 摘要Abstract:Tcl/Tk脚本可以很容易实现用户自定义的命令,方便的创建图形化的用户界面GUI,所以Tcl和T ...
- 学习WPF——使用Font-Awesome图标字体
图标字体介绍 在介绍图标字体之前,不得不介绍图标格式ICON ICON是一种图标格式,我们操作系统中各种应用程序都包含一个图标 比如QQ程序的图标是一个可爱的企鹅,我的电脑是一个显示器图标 ----- ...
- JAVA设计模式《四》
经过前几篇的介绍相信大家对JAVA的设计模式一定有所解了,本篇我们再一起学习一下适配器模式.代理模式和工厂模式. 适配器模式使用的场景非常多,例如现实生活中,我们的笔记本电脑的充电线大部分都是三向插头 ...
- Spark入门实战系列--5.Hive(下)--Hive实战
[注]该系列文章以及使用到安装包/测试数据 可以在<倾情大奉送--Spark入门实战系列>获取 1.Hive操作演示 1.1 内部表 1.1.1 创建表并加载数据 第一步 启动HDFS ...
- WEKA使用(基础配置+垃圾邮件过滤+聚类分析+关联挖掘)
声明: 1)本文由我bitpeach原创撰写,转载时请注明出处,侵权必究. 2)本小实验工作环境为Windows系统下的WEKA,实验内容主要有三部分,第一是分类挖掘(垃圾邮件过滤),第二是聚类分析, ...
- Microsoft Azure News(1) 新的数据中心Japan East, Japan West and Brazil South
<Windows Azure Platform 系列文章目录> 微软官方博客今天表示,微软宣布将在日本东部(埼玉县)和日本西部(大阪)提供Windows Azure服务.就在最近,微软为W ...
- resin4的初次配置与使用
之前用的resin3,结果发布新项目老师文件冲突,我也找不到是哪里有问题,于是尝试使用resin4. 首先从官网下载最新resin4. 然后放到opt下,tar -zvxf 解压. 然后修改conf/ ...
- 弹出框优化实例(alert和confirm)
在项目过程中会遇到需要使用自己定义的弹出框的情况.以前用过ymprompt,但是它太复杂而且不好自己操控.所以自己写了一个弹出框实例. 主要有两类弹出框alert和confirm.基于jQuery a ...
- Moon.Orm 5.0(MQL版)及之前版本的开源计划
开源综述:步步开源 Moon.Orm 5.0 (MQL版) 版本维护及下载 (跟踪发布) Moon.Orm 5.0系列文章 Moon.Orm 5.0性能问题,将发言权交给你! 一.5.0目前的情况,步 ...