【循序渐进学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 sqlite3conn = 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 sqlite3def 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,sysconn = 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'% pairprint

运行程序,通过命令行传递查询参数:

python food_query.py "kcal <=100 AND fiber >= 10 ORDER BY sugar"

参考资料&进一步阅读

Python Doc —— sqlite3

Python基础教程

转载于:https://www.cnblogs.com/IPrograming/p/Python-database.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/258085.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Foundation框架

1.框架是由许多类、方法、函数、文档按照一定的逻辑组织起来的集合&#xff0c;以便使研发程序变的更容易 清除缓存&#xff0c;删除这个文件夹下的所有文件/Users/fanyafang/Library/Developer/Xcode/DerivedData 显示隐藏文件&#xff1a;defaults write com.apple.finder Ap…

ubuntu上搭建php,ubuntu10.04上搭建php网站运行环境

ubuntu 10.04下搭建php网站运行环境ubuntu 10.04下搭建php网站运行环境前提&#xff1a;要打开root权限sudo password [这里填写root密码]1、第一步安装ubuntu10.042、更新源sudo apt-get update3、安装lighttpdsudo apt-get install lighttpd安装好之后检查lighttpd是否成功启…

Windows 10 Threshold 2 升级记录

昨天&#xff08;11月17日&#xff09;升级到Windows 10 Threshold 2版本。我的使用的设备是Surface Pro 3&#xff0c;4G内存&#xff0c;128G硬盘。 Threshold 2是作为一个Windows系统更新推送的。如果没有收到系统更新提示&#xff0c;在系统设置里面手动检查一下更新就可以…

转换php script类型,javascript如何实现值的类型转换

本篇文章给大家介绍使用javascript进行值的类型转换的方法&#xff0c;有一定的参考价值&#xff0c;有需要的朋友可以参考一下&#xff0c;希望对你们有所帮助。JavaScript是松散类型的语言&#xff0c;大多数情况下&#xff0c;运算符和函数会自动将值转换为正确的类型(隐式转…

iOS屏幕适配方案-Auto Layout

市场上的android手机五花八门。各种尺寸的屏幕让android程序员们比較头疼。也有一些大神写了一些博客提出了自己的观点。iOS貌似也迎来了大屏6&#xff0b;&#xff0c;因此屏幕适配的问题也是有滴&#xff0c;因此苹果也有自己的方法&#xff0d;auto Layout 。本人初学iOS。今…

Exercise 12: Prompting People

age raw_input("How old are you? ") height raw_input("How tall are you? ") weight raw_input("How much do you weigh? ") print "So, youre %r old, %r tall and %r heavy." % ( age, height, weight) 转载于:https://www.…

一年一循环

一年了&#xff0c;没怎么关注博客园&#xff0c;回来看看。 希望自己今后多学多记录多分享。转载于:https://www.cnblogs.com/Chinarain/p/4974904.html

JAVA三角海伦公式,海伦公式求三角形面积出错求教

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼就下面这个程序 输入其他的数字都可以算出面积 但是当输入3,4,6时 计算出面积为零 求吧友指出错误在哪package javaapplication17;import java.util.Scanner;public class JavaApplication17 {public static void main(String[] ar…

虚拟机里面安装Openfiler 2.99

2019独角兽企业重金招聘Python工程师标准>>> 简介 Openfiler 由rPath Linux驱动&#xff0c;它是一个基于浏览器的免费网络存储管理实用程序&#xff0c;可以在单一框架中提供基于文件的网络连接存储 (NAS) 和基于块的存储区域网 (SAN)。Openfiler 支持 CIFS、NFS、…

win10如何搭建php,Win10系统怎么搭建php环境 win10搭建PHP环境方法

Win10系统怎么搭建php环境&#xff1f;win10搭建PHP环境方法。在今天的Win10系统使用教程中&#xff0c;我们将给大家分享的是在Win10系统下搭建Apache和PHP的开发环境的方法。可能有网友会问&#xff1a;Win10系统搭载Apache和PHP的开发环境的方法是不是与Win7/Win8.1的差不多…

关于jmf不能播放mp3的问题解决

想写个JAVA的MP3音乐管理器&#xff0c;使用JMF插件&#xff0c;但发现运行时总报一个异常&#xff1a;Unable to handle format: mpeglayer3, 44100.0 Hz, 16-bit, Stereo, LittleEndian, Signed, 16000.0 frame rate, FrameSize32768 bitsFailed to realize: com.sun.media.P…

LINK:fatal error LNK1123: 转换到 COFF 期间失败: 文件无效或损坏

原文地址&#xff1a;http://yacare.iteye.com/blog/2010049 很多伙伴在更新VS2010&#xff0c;或者卸载VS2012安装2010后&#xff0c;建立Win32 Console Project/MFC项目时会出现"LINK : fatal error LNK1123: 转换到 COFF 期间失败: 文件无效或损坏"的错误。 错误描…

网站出现403 Forbidden

1&#xff0c; 你在一定时间内过多地访问此网站&#xff08;一般是用采集程序&#xff09;&#xff0c;被防火墙拒绝访问了 2&#xff0c; 网站域名解析到了空间&#xff0c;但空间未绑定此域名 3&#xff0c; 你的网页脚本文件在当前目录下没有执行权限 4&#xff0c; 服务器繁…

matlab离散信号卷积和,信号与系统实验(MATLAB版)实验7离散信号的卷积和.ppt

一、实验目的   1 熟悉离散时间信号卷积的定义、表示以及卷积的结果;    2 掌握利用计算机进行离散时间信号卷积运算的原理和方法;    3 熟悉离散时间信号的相关计算方法;    4 熟悉离散时间信号卷积运算函数conv和deconv的应用。   2. 卷积计算的几何解法…

学Linux从编译命令开始——arm-linux-gcc常用参数讲解

1.想要编译出ARM平台上的代码&#xff0c;需要四个步骤&#xff0c;预处理&#xff0c;编译&#xff0c;汇编&#xff0c;链接。 arm-linux-gcc有诸多选项 arm-linux-gcc -o main main.c  不加-c、-S、-E等参数&#xff0c;则同时进行四个步骤&#xff0c;生成可执行文件。 其…

【转】如何在编程生涯中有一个好的开端

本文来自&#xff1a;http://www.techug.com/how-get-jump-start-your 作者&#xff1a;http://www.techug.com/author/admin&#xff08;中文&#xff0c;译作者&#xff09; 作者&#xff1a;http://java.dzone.com/users/simpleprogrammer&#xff08;英文&#xff0c;原作者…

git的使用1[转]

在应用程序开发过程中&#xff0c;很重要的一部分工作就是如何进行源码的版本控制。当代码出现问题时&#xff0c;我们就需要将代码恢复到原先正常的版本。如果是多个人共同开发一个项目&#xff0c;那么代码的控制就会非常复杂。幸运的是&#xff0c;开发者不需要自己控制这些…

matlab做比例积分微分控制,收放卷卷径计算+闭环摆杆控制参数自适应PID控制算法(变比例变积分变微分)介绍...

项目简介最近在一个客户现场搞熔边机项目&#xff0c;涉及到收放卷工艺的卷径计算&#xff0c;同时张力控制使用的是摆杆&#xff0c;然后通过PID控制输出辅助转速补偿收卷伺服速度。单一的PID参数不能自动适应卷径变化,如在小卷径200mm下调试整定出的一组PID参数&#xff0c;当…

如何检测支付宝接口中notify_url.php有没有返回,支付宝中的手机网站支付接口,php版 notify_url.php 异步通知页面未成功执行...

require_once("alipay.config.php");require_once("lib/alipay_notify.class.php");$alipayNotify new AlipayNotify($alipay_config);$verify_result $alipayNotify->verifyNotify();if($verify_result) {//验证成功$notify_data $alipayNotify->…