python网络编程学习笔记(九):数据库客户端 DB-API


Posted in Python onJune 09, 2014

一、DB-API概述

      python支持很多不同的数据库。由于不同的卖家服务器导致和数据库通信的网络协议各有不同。在python的早期版本中,每一种数据库都带有自己的python模块,所有这些模块以不同的方式工作,并提供不同的函数。这种方法不便于编写能够在多种数据库服务器类型中运行的代码,于是DB-API库函数产生。在DB-API中,所有连接数据库的模块即便是底层网络协议不同,也会提供一个共同的接口。这一点和JAVA中的JDBC和ODBC类似。
      DB-API下载地址:http://wiki.python.org/moin/DatabaseProgramming,目前版本是2.0,支持数据库包括IBM DB2、Firebird (and Interbase) 、Informix、Ingres、MySQL、Oracle 、PostgreSQL 、SAP DB (also known as "MaxDB") 、Microsoft SQL Server 、Sybase 等。

二、数据库连接

1、PostgreSQL

      有几个模块可以完成python与PostgreSQL的联接,这里主要介绍使用psycopg。
下载地址是:http://initd.org/psycopg/download/。如果没有PostgreSQL,可以从以下地址下载:http://www.postgresql.org/。(关于PostgreSQL的安装等更加详细的介绍,可以见http://wenku.baidu.com/view/8e32d10c6c85ec3a87c2c500.html。)连接PostgreSQL数据库:

import psycopg2
print "connecting to test"##test为数据库名
dbh=psycopg2.connect('dbname=test user=postgres')
print "connection successful"

2、MySQL

对于MySQL,python的接口是已知的MySQLdb或者MySQL-Python,下载地址:http://sourceforge.net/projects/mysql-python/。与PostgreSQL不同的是,MySQLdb connect()函数可以带各种参数,具体如下:

参数 说明
user 用户名,默认为当前登录用户。
passwd 用户密码,没有默认的。
db 连接的数据库名。
host 数据库主机名。
port TCP端口,默认是3306。

举例,连接test数据库:
import MySQLdb
print "connecting..."
dbh=MySQLdb.connect(db="test")
print "connection successful."
dbh.close()

三、简单操作(以PostgreSQL为例)

这里以PostgreSQL为例介绍创建表、查询表等操作。例子中数据库名为test,用户名为postgres,输入一个表名,向表中插入数据并进行查询。具体如下,已进行了注示:

import psycopg2
print "connecting to test"
dbh=psycopg2.connect('dbname=test user=postgres')
print "connection successful"
cur=dbh.cursor()#建立一个cursor对象,返回数据为字典形式
a=raw_input('table list:')#输入表名
cur.execute("CREATE TABLE %s(myid integer UNIQUE,filename varchar(255))" %a)#生成表,包含一个字段filename
b=1c='201210310540'
cur.execute("INSERT INTO %s VALUES (%d,%s)"%(a,b,c))#向表中插入记录b,c
cur.execute("SELECT * FROM %s " %a)#查询表中内容
rows=cur.fetchall()#获得结果集中的所有行
for row in rows:
    print row
dbh.commit()#以上对数据库的操作事务生效
dbh.close()

1、事务

多数数据库支持事务,事务可以将多条对数据库的改动放在一条命令中。在上面的例子中,当未曾执行commit()命令时,以上对数据库的操作均不会生效。另外还有一个函数rollback(),这个函数可以有效的放弃上一次执行commit()或者rollback()之后的改动。这个函数在发现错误,并想放弃已经发出的事务时,非常有效。对于不支持事务的数据库,改变会立刻执行,commit()什么也不做,但rollback()会报错。

2、效率

执行事件的性能很大程序上取决于不同的服务器,一般来说,在每个单独的命令后都提交是更新数据库最慢的方法,但如果一次提交很大数据又会使服务器产生buffer溢出。因此,应该合理处理提交的数量。

四、参数风格
在上面的例子中,使用了printf()一样的类型格式。但实际上,在DB-API中,不同的数据库所支持的参数风络不同,必须选择合适的方法,否则程序不会执行。下面的方法,可以知道当前所支持的类型格式。

>>> import psycopg2
>>> print psycopg2.paramstyle

pyformat这一结果可以看出,当前支持pyformat格式。

针对DB-API说明书,以使用频度由小变大的顺序介绍:

qmark 表示question-mark风格。指令字符串中的数据的每一位都被用一个问号替换,参数以list或tuple的形式给出。例如:INSERT INTO ch14 VALUES (?, ?)。
format 使用和printf()一样的类型格式,不支持对于指定参数Python的扩展名。它带一个list或tuple来转换。例如:INSERT INTO ch14 VALUES(%d, %s)
numeric 表示numeric风格。指令字符串中的数据的每一位都被一个后面是数字的冒号替换(数字以1开始),参数以list或tuple的形式给出。例如:INSERT INTO ch14 VALUES(:1, :2)
named 表示named风格。和numeric类似,但是在冒号后面用名称取代数字。带一个dictionary用来转换。例如:INSERT INTO ch14 VALUES(:number, :text)
pyformat 支持Python风格的参数,带dictionary用来转换。例如:INSERT INTO ch14 VALUES(%(number)d, %(text)s)。

五、重复指令
1、execute和executemany()

例子:

将下面的数据插入到test数据库中:

12 Twelve
13 Thirteen
14 Fourteen
15 Fifteen

(1)execute一条条插入

cur.execute("INSERT INTO test VALUES (12, 'Twelve')")
cur.execute("INSERT INTO test VALUES (13, 'Thirteen')")
cur.execute("INSERT INTO test VALUES (14, 'Fourteen')")
cur.execute("INSERT INTO test VALUES (15, 'Fifteen')")

这种方法过于低效。

(2)executemany()函数带一个指令和一列指令运行的记录。列表上的每条记录要么是一个list,要么是一个dictionary。

import psycopg2
print "connecting to test"
dbh=psycopg2.connect('dbname=test user=postgres')
print "connection successful"
cur=dbh.cursor()
rows = ({'num': 0, 'text': 'Zero'},
         {'num': 1, 'text': 'Item One'},
         {'num': 2, 'text': 'Item Two'},
         {'num': 3, 'text': 'Three'})
cur.executemany("INSERT INTO test VALUES (%(num)d, %(text)s)", rows)
dbh.commit()
dbh.close()

executemany()主要的缺点是,在需要执行指令前把所有的记录放在内存中。如果数据大的话,这就是一个问题,它会占有系统的所有内存资源。如果executemany()不能满足需要,那么除了execute()之外,还是有可能取得性能优化的。根据DB-API说明,当execute()被周期性调用时,数据库后端可以执行优化。但是它的第一个参数必须指向同一个对象,而不是一个含有相同值的字符串,即在内存中的同一个字符串对象。和executemany()一样,这样并不能保证优化,并且也不能期望execute()运行得比executemany()快。但是如果不能使用executemany(),这就是一个最好的选择。

六、fetchall、fetchmany、fetchone获取数据

fetchall(self):接收全部的返回结果行。

fetchmany(self, size=None):接收size条返回结果行.如果size的值大于返回的结果行的数量,则会返回cursor.arraysize条数据。

fetchone(self):返回一条结果行。

七、获取metadata(元数据)

元数据的英文名称是“Metadata",它是“关于数据的数据”。如在上面的例子中,Metadata的结果为:

Column(name='id', type_code=23, display_size=None, internal_size=4, precision=None, scale=None, null_ok=None)
Column(name='filename', type_code=1043, display_size=None, internal_size=255, precision=None, scale=None, null_ok=None)

import psycopg2
print "connecting to bbstime"
dbh=psycopg2.connect('dbname=bbstime user=postgres')
print "connection successful"
cur=dbh.cursor()
cur.execute("SELECT * FROM asd")
for column in cur.description:
    print column
dbh.close()

八、计算行数
方法有两种,一种是用len(),一种是用rowcount。

import psycopg2
print "connecting to bbstime"
dbh=psycopg2.connect('dbname=bbstime user=postgres')
print "connection successful"
cur=dbh.cursor()
cur.execute("SELECT * FROM test")
rows=cur.fetchall()
print len(rows)#利用len来计算行数
print "rows:",cur.rowcount#利用rowcount来计算行数 
dbh.close()
Python 相关文章推荐
python实现停车管理系统
Nov 30 Python
python通过tcp发送xml报文的方法
Dec 28 Python
selenium+python自动化测试之使用webdriver操作浏览器的方法
Jan 23 Python
使用python实现ftp的文件读写方法
Jul 02 Python
python利用7z批量解压rar的实现
Aug 07 Python
python中的逆序遍历实例
Dec 25 Python
关于pytorch处理类别不平衡的问题
Dec 31 Python
Linux安装Python3如何和系统自带的Python2并存
Jul 23 Python
Pycharm自带Git实现版本管理的方法步骤
Sep 18 Python
python实现感知机模型的示例
Sep 30 Python
基于python实现监听Rabbitmq系统日志代码示例
Nov 28 Python
pandas 实现将NaN转换为None
May 14 Python
python网络编程学习笔记(八):XML生成与解析(DOM、ElementTree)
Jun 09 #Python
python网络编程学习笔记(七):HTML和XHTML解析(HTMLParser、BeautifulSoup)
Jun 09 #Python
python网络编程学习笔记(六):Web客户端访问
Jun 09 #Python
python网络编程学习笔记(五):socket的一些补充
Jun 09 #Python
python网络编程学习笔记(四):域名系统
Jun 09 #Python
python网络编程学习笔记(三):socket网络服务器
Jun 09 #Python
python网络编程学习笔记(二):socket建立网络客户端
Jun 09 #Python
You might like
一些操作和快捷键的理解和讨论
2020/03/04 星际争霸
php错误级别的设置方法
2013/06/17 PHP
PHP+MySql+jQuery实现的"顶"和"踩"投票功能
2016/05/21 PHP
PHP中$GLOBALS['HTTP_RAW_POST_DATA']和$_POST的区别分析
2017/07/03 PHP
关于ThinkPHP中的异常处理详解
2018/05/11 PHP
PHP implode()函数用法讲解
2019/03/08 PHP
PHP语言对接抖音快手小红书视频/图片去水印API接口源码
2020/08/11 PHP
Flexigrid在IE下不显示数据的有效处理方法
2014/09/04 Javascript
AngularJS入门教程(零):引导程序
2014/12/06 Javascript
jQuery中:radio选择器用法实例
2015/01/03 Javascript
javascript判断数组内是否重复的方法
2015/04/21 Javascript
js流动式效果显示当前系统时间
2016/05/16 Javascript
jQuery实现手机上输入后隐藏键盘功能
2017/01/04 Javascript
基于Bootstrap的标签页组件及bootstrap-tab使用说明
2017/07/25 Javascript
vue实现全选和反选功能
2017/08/31 Javascript
使用ngrok+express解决本地环境中微信接口调试问题
2018/02/26 Javascript
微信小程序获取用户openid的实现
2018/12/24 Javascript
JavaScript设计模式之观察者模式实例详解
2019/01/16 Javascript
Python 3中print函数的使用方法总结
2017/08/08 Python
Django中使用celery完成异步任务的示例代码
2018/01/23 Python
Python 最强编辑器详细使用指南(PyCharm )
2019/09/16 Python
Python unittest框架操作实例解析
2020/04/13 Python
Django封装交互接口代码
2020/07/12 Python
纯CSS实现预加载动画效果
2017/09/06 HTML / CSS
英国二手物品交易网站:Preloved
2017/10/06 全球购物
好莱坞百老汇御用王牌美妆:Koh Gen Do 江原道
2018/04/03 全球购物
Manuka Doctor英国官网:真正的麦卢卡蜂蜜和护肤品
2018/10/26 全球购物
教师自我评价范文
2013/12/16 职场文书
运动会邀请函范文
2014/02/06 职场文书
升学宴主持词
2014/04/02 职场文书
终止劳动合同协议书
2014/10/05 职场文书
简历自荐信范文
2015/03/09 职场文书
2016年五四青年节校园广播稿
2015/12/17 职场文书
2016年区委书记抓基层党建工作公开承诺书
2016/03/25 职场文书
使用numpy nonzero 找出非0元素
2021/05/14 Python
win10系统xps文件怎么打开?win10打开xps文件的两种操作方法
2022/07/23 数码科技