一、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,数据库客户端
《魔兽世界》大逃杀!60人新游玩模式《强袭风暴》3月21日上线
暴雪近日发布了《魔兽世界》10.2.6 更新内容,新游玩模式《强袭风暴》即将于3月21 日在亚服上线,届时玩家将前往阿拉希高地展开一场 60 人大逃杀对战。
艾泽拉斯的冒险者已经征服了艾泽拉斯的大地及遥远的彼岸。他们在对抗世界上最致命的敌人时展现出过人的手腕,并且成功阻止终结宇宙等级的威胁。当他们在为即将于《魔兽世界》资料片《地心之战》中来袭的萨拉塔斯势力做战斗准备时,他们还需要在熟悉的阿拉希高地面对一个全新的敌人──那就是彼此。在《巨龙崛起》10.2.6 更新的《强袭风暴》中,玩家将会进入一个全新的海盗主题大逃杀式限时活动,其中包含极高的风险和史诗级的奖励。
《强袭风暴》不是普通的战场,作为一个独立于主游戏之外的活动,玩家可以用大逃杀的风格来体验《魔兽世界》,不分职业、不分装备(除了你在赛局中捡到的),光是技巧和战略的强弱之分就能决定出谁才是能坚持到最后的赢家。本次活动将会开放单人和双人模式,玩家在加入海盗主题的预赛大厅区域前,可以从强袭风暴角色画面新增好友。游玩游戏将可以累计名望轨迹,《巨龙崛起》和《魔兽世界:巫妖王之怒 经典版》的玩家都可以获得奖励。
更新动态
- 凤飞飞《我们的主题曲》飞跃制作[正版原抓WAV+CUE]
- 刘嘉亮《亮情歌2》[WAV+CUE][1G]
- 红馆40·谭咏麟《歌者恋歌浓情30年演唱会》3CD[低速原抓WAV+CUE][1.8G]
- 刘纬武《睡眠宝宝竖琴童谣 吉卜力工作室 白噪音安抚》[320K/MP3][193.25MB]
- 【轻音乐】曼托凡尼乐团《精选辑》2CD.1998[FLAC+CUE整轨]
- 邝美云《心中有爱》1989年香港DMIJP版1MTO东芝首版[WAV+CUE]
- 群星《情叹-发烧女声DSD》天籁女声发烧碟[WAV+CUE]
- 刘纬武《睡眠宝宝竖琴童谣 吉卜力工作室 白噪音安抚》[FLAC/分轨][748.03MB]
- 理想混蛋《Origin Sessions》[320K/MP3][37.47MB]
- 公馆青少年《我其实一点都不酷》[320K/MP3][78.78MB]
- 群星《情叹-发烧男声DSD》最值得珍藏的完美男声[WAV+CUE]
- 群星《国韵飘香·贵妃醉酒HQCD黑胶王》2CD[WAV]
- 卫兰《DAUGHTER》【低速原抓WAV+CUE】
- 公馆青少年《我其实一点都不酷》[FLAC/分轨][398.22MB]
- ZWEI《迟暮的花 (Explicit)》[320K/MP3][57.16MB]