第十三章 数据库支持
第十三章 数据库支持
本章讨论Python数据库API(一种连接到SQL数据库的标准化方式),并演示如何使用这个API来执行一些基本的SQL。最后,本章将讨论其他一些数据库技术。
关Python支持的数据库清单
Python数据库API
标准数据库API(DB API)
Python官方维基百科中的数据库编程指南
全局变量
变量名 | 描述 |
---|---|
apilevel | 使用的Python DB API版本;是一个字符串常量,指出了使用的API版本。 |
threadsafety | 模块的线程安全程度如何;是一个0~3(含)的整数。0表示线程不能共享模块,而3表示模块是绝对线程安全的。1表示线程可共享模块本身,但不能共享连接,而2表示线程可共享模块和连接,但不能共享游标。 |
paramstyle | 在SQL查询中使用哪种参数风格;format’表示标准字符串格式设置方式(使用基本的格式编码),如在要插入参数的地方插入%s。'pyformat’表示扩展的格式编码,即旧式字典插入使用的格式编码,如%(foo)s;'qmark’表示使用问号,'numeric’表示使用:1和:2这样的形式表示字段(其中的数字是参数的编号),而’named’表示使用:foobar这样的形式表示字段(其中foobar为参数名) |
异常
异常 | 超类 | 描述 |
---|---|---|
StandardError | 所有异常的超类 | |
Warning | StandardError | 发生非致命问题时引发 |
Error | StandardError | 所有错误条件的超类 |
InterfaceError | Error | 与接口(而不是数据库)相关的错误 |
DatabaseError | Error | 与数据库相关的错误的超类 |
DataError | DatabaseError | 与数据相关的问题,如值不在合法的范围内 |
OperationalError | DatabaseError | 数据库操作内部的错误 |
IntegrityError | DatabaseError | 关系完整性遭到破坏,如键未通过检查 |
InternalError | DatabaseError | 数据库内部的错误,如游标无效 |
ProgrammingError | DatabaseError | 用户编程错误,如未找到数据库表 |
NotSupportedError | DatabaseError | 请求不支持的功能,如回滚 |
连接和游标
要使用底层的数据库系统,必须先连接到它,为此可使用名称贴切的函数connect。接受多个参数,具体是哪些取决于要使用的数据库。
函数connect的常用参数
参数名 | 描述 | 是否可选 |
---|---|---|
dsn | 数据源名称,具体含义随数据库而异 | 否 |
user | 用户名 | 是 |
password | 用户密码 | 是 |
host | 主机名 | 是 |
database | 数据库名称 | 是 |
函数connect返回一个连接对象,表示当前到数据库的会话。
连接对象的方法
方法名 | 描述 |
---|---|
close() | 关闭连接对象。之后,连接对象及其游标将不可用 |
commit() | 提交未提交的事务——如果支持的话;否则什么都不做 |
rollback() | 回滚未提交的事务(可能不可用) |
cursor() | 返回连接的游标对象 |
游标对象的方法
名称 | 描述 |
---|---|
callproc(name[, params]) | 使用指定的参数调用指定的数据库过程(可选) |
close() | 关闭游标。关闭后游标不可用 |
execute(oper[, params]) | 执行一个SQL操作——可能指定参数 |
executemany(oper, pseq) | 执行指定的SQL操作多次,每次都序列中的一组参数 |
fetchone() | 以序列的方式取回查询结果中的下一行;如果没有更多的行,就返回None |
fetchmany([size]) | 取回查询结果中的多行,其中参数size的值默认为arraysize |
fetchall() | 以序列的序列的方式取回余下的所有行 |
nextset() | 跳到下一个结果集,这个方法是可选的 |
setinputsizes(sizes) | 用于为参数预定义内存区域 |
setoutputsize(size[, col]) | 为取回大量数据而设置缓冲区长度 |
游标对象的属性
名称 | 描述 |
---|---|
description | 由结果列描述组成的序列(只读) |
rowcount | 结果包含的行数(只读) |
arraysize | fetchmany返回的行数,默认为1 |
类型
DB API构造函数和特殊值
名称 | 描述 |
---|---|
Date(year, month, day) | 创建包含日期值的对象 |
Time(hour, minute, second) | 创建包含时间值的对象 |
Timestamp(y, mon, d, h, min, s) | 创建包含时间戳的对象 |
DateFromTicks(ticks) | 根据从新纪元开始过去的秒数创建包含日期值的对象 |
TimeFromTicks(ticks) | 根据从新纪元开始过去的秒数创建包含时间值的对象 |
imestampFromTicks(ticks) | 根据从新纪元开始过去的秒数创建包含时间戳的对象 |
Binary(string) | 创建包含二进制字符串值的对象 |
STRING | 描述基于字符串的列(如CHAR) |
BINARY | 描述二进制列(如LONG或RAW) |
NUMBER | 描述数字列 |
DATETIME | 描述日期/时间列 |
ROWID | 描述行ID列 |
SQLite和PySQLite
起步
导入模块sqlite3来导入Python标准库中的SQLit
import sqlite3#导入模块sqlite3
conn = sqlite3.connect('beyond.db')#连接数据库,若数据库不存在则自动创建
curs = conn.cursor()#从连接获得游标,这个游标可用来执行SQL查询。
conn.commit()#在每次修改数据库后都进行提交
conn.close()#关闭连接
数据库应用程序示例
ABBREV.txt数据库信息放在与程序同一个目录下
ABBREV.txt
在文件ABBREV.txt中,每行都是一条数据记录,字段之间用脱字符(^)分隔。
数字字段直接包含数字,而文本字段用两个波浪字符(~)将其字符串值括起。
将这个ASCII文件中的数据转换为SQL数据库
1,创建并填充数据库表
创建一个名为food的表
读取文件ABBREV.txt并对其进行分析
通过调用curs.execute来执行一条SQL INSERT语句,从而将字段中的值插入数据库中。
将数据导入数据库
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 (?,?,?,?,?,?,?,?,?,?)'
field_count = 10
for line in open('ABBREV.txt'):fields = line.split('^') vals = [convert(f) for f in fields[:field_count]] curs.execute(query, vals)conn.commit()
conn.close()
当你运行这个程序时(文件ABBREV.txt和它位于同一个目录),它将新建一个名为food.db的文件,其中包含数据库中的所有数据。
2,搜索并处理结果
数据库查询程序
import sqlite3,sys
conn = sqlite3.connect('food.db')
curs = conn.cursor()
query = 'SELECT * FROM food WHERE ' + 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('{}: {}'.format(*pair)) print()
小结
概念 | 解释 |
---|---|
Python DB API | 这个API定义了一个简单的标准化接口,所有数据库包装器模块都必须遵循它,这让编写使用多个不同数据库的程序更容易。 |
连接 | 连接对象表示到SQL数据库的通信链路,使用方法cursor可从连接获得游标。你还可使用连接对象来提交或回滚事务。使用完数据库后,就可将连接关闭了。 |
游标 | 游标用于执行查询和查看结果。可逐行取回查询结果,也可一次取回很多(或全部)行。 |
类型和特殊值 | DB API指定了一组构造函数和特殊值的名称。构造函数用于处理日期和时间对象,还有二进制数据对象;而特殊值用于表示关系型数据库的类型,如STRING、NUMBER和DATETIME。 |
SQLite | 这是一个小型的嵌入式SQL数据库,标准Python发行版中包含其Python包装器,即模块sqlite3。这个数据库速度快、易于使用,且不要求搭建专门的服务器。 |
本章介绍的函数
函数 | 描述 |
---|---|
connect(…) | 连接到数据库并返回一个连接对象 |
第十三章 数据库支持相关推荐
- 【数据库系统】数据库系统概论====第十三章 数据库技术发展
第十三章 数据库技术发展 文章目录 第十三章 数据库技术发展 13.1数据库技术发展概述 13.2数据库发展的3个阶段 13.2.1第一代数据库系统 13.2.2第二代数据库系统 13.2.3新一代数 ...
- 第二十三章 MySQL数据库 手册2 SQL语句
第二十三章 MySQL数据库 手册2 SQL语句 实验二:用SQL语句,管理数据库 `危险命令,delete 后不加 where 条件代表删除所有数据 delete.` `更加危险的删除命令trunc ...
- DreamFactory - 第3章生成数据库支持的API
DreamFactory - 第3章生成数据库支持的API DreamFactory的功能十分强大,但是除了生成数据库支持的REST API之外,没有比这更受欢迎的功能了.通过采用这种自动化方法,开发 ...
- 数字图像处理:第二十三章 基于内容的图象与视频检索
第二十三章基于内容的图象与视频检索 目录 1. 引言 2. 基于内容检索的图象特征 3. 基于内容的视频标注与检索 作业 1. 引言 随着社会的信息化发展日益深入,互连网日益普及,越 ...
- 《Reids 设计与实现》第十三章 Sentinel
<Reids 设计与实现>第十三章 Sentinel 文章目录 <Reids 设计与实现>第十三章 Sentinel 一.简介 二.启动并初始化 Sentinel 1.初始化服 ...
- 《深入理解 Spring Cloud 与微服务构建》第十三章 配置中心 Spring Cloud Config
<深入理解 Spring Cloud 与微服务构建>第十三章 配置中心 Spring Cloud Config 文章目录 <深入理解 Spring Cloud 与微服务构建>第 ...
- 第十三章 使用动态SQL(一)
文章目录 第十三章 使用动态SQL(一) 动态SQL简介 动态SQL与嵌入式SQL `%SQL.Statement`类 创建一个对象实例 %SelectMode属性 %SchemaPath属性 %Di ...
- 第十三章 系统错误消息 - 一般系统错误消息 S - Z
文章目录 第十三章 系统错误消息 - 一般系统错误消息 S - Z 第十三章 系统错误消息 - 一般系统错误消息 S - Z 错误代码 描述 <SUBSCRIPT> 下标值不合法或Glob ...
- 4.10 第十三章:Linux系统管理技巧
第十三章:Linux系统管理技巧 13.1监控系统的状态 13.1.1使用w命令查看当前系统的负载 13.1.2用vmstat命令监控系统的状态 13.1.3用top命令显示进程所占的系统资源 13. ...
最新文章
- R可视化ggplot2绘制堆叠的条形图(Stacked Barplot)
- ITRON系统使用方法
- 贝叶斯多元Logistics回归理论基础
- Mavan的配置,以及与IDEA版本不一致,解决办法
- ieee文章作者对不齐怎么办呢?
- 自然语言处理之长短时记忆网络(六)
- python箱线图读取的几列数据_【分析篇】:python 基本数据统计和绘制箱线图
- HTML 显示特殊字符时转义操作
- android 字体点击变色,Android TextView 中实现部分文字变色以及点击事件
- 百面机器学习—3.逻辑回归与决策树要点总结
- django 学习个人总结 之many_to_one
- delphixe android服务,delphi xe10 android服务gps [复制]
- Pyside2 背景图片填充
- threejs 模型添加文字的几种方式
- bat 删除文件脚本
- tomcat禁止外网访问,允许locat访问
- 【Android】CTS测试
- 没有学历可以做程序员吗?
- 计算总成绩和平均成绩
- Check It Again: Progressive Visual Question Answering via Visual Entailment