Code前端首页关于Code前端联系我们

Python网络编程学习笔记:数据库客户端DB-API

terry 2年前 (2023-09-25) 阅读数 75 #后端开发

1. db-api 概述

Python 支持许多不同的数据库。由于供应商服务器不同,与数据库通信所使用的网络协议也不同。在以前版本的 Python 中,每个数据库都带有自己的 Python 模块,每个模块以不同的方式工作并提供不同的功能。这种方法对于编写可以在多种类型的数据库服务器上运行的代码来说没有什么用处,因此创建了 db-api 库函数。在db-api中,所有连接到数据库的模块都会提供一个通用的接口,即使底层的网络协议不同。这类似于Java中的jdbc和odbc。
db-api下载地址:,当前版本为,支持的数据库包括ibm db2、firebird(和interbase)、informix、ingres、mysql、oracle、postgresql、sap db(也称为“maxdb”)、microsoft sql服务器、sybase 等

2。数据库连接

1. postgresql

有几个模块可以完成python和postgresql之间的连接。这里我们主要介绍psycopg的使用。
下载地址为:。如果你没有postgresql,可以从以下地址下载: 。 (更详细的安装postgresql介绍请参见。)连接postgresql数据库:

import psycopg2
print "connecting to test"##test为数据库名称
dbh=(' dbname=testuser =postgres')
打印“连接成功”

2、mysql

对于mysql来说,Python接口称为mysqldb或mysql-python,下载地址:。与postgresql不同,mysqldb connect()函数可以带多个参数,如下:

参数描述
用户用户名,默认值为当前登录的用户。
passwd 用户密码,无默认。
db连接的数据库的名称。
主机数据库主机名。
porttcp端口,默认为3306。

例如连接测试数据库:

import mysqldb
print "connecting..."
dbh=(db= “测试”)
打印“连接成功。”
()

3.简单操作(以postgresql为例)

这里以postgresql为例,介绍创建表、查询表等操作。在示例中,数据库名称为 test,用户名为 postgres。输入表名,向表中插入数据,然后运行查询。详细信息如下,并注明:

import psycopg2
print "连接到测试"
dbh=('dbname=test user=postgres')
print "连接成功"
cur =()#创建游标对象,并以字典形式返回数据
a=raw_input('table list:') #输入表名
("create table %s(myid integer unique,filename varchar ( 255) )" %a) #生成表,包含文件名字段
b=1c='201210310540'
("插入%s个值​​(%d,%s)"%(a, b ,c) ) 将 #Records b,c
("select * from %s " %a) 插入表中?中间。在上面的例子中,如果不执行commit()命令,则以上操作都不会在数据库上生效。还有一个rollback()函数,它可以有效地丢弃最后一次commit()或rollback()执行后的更改。当检测到错误并且您想要中止已执行的事务时,此功能非常有效。对于不支持事务的数据库,更改会立即执行,commit() 不执行任何操作,但 rollback() 会报告错误。

2。效率

事件执行的性能高度依赖于不同的服务器。一般来说,在每个单独的命令之后提交是更新数据库最慢的方法,但如果一次提交很大,数据将导致服务器上的缓冲区溢出。因此,应适当处理条目数量。

4。参数样式
上面的示例使用与 printf() 相同的类型格式。但实际上db-api中不同的数据库支持不同的参数,必须选择正确的方法,否则程序将无法运行。可以通过以下方法了解当前支持的类型格式。

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

pyformat 这个结果表明目前支持 pyformat 格式。

对于db-api手册,按照使用频率递增的顺序介绍:

qmark表示问号样式。命令字符串中数据的每一位都用问号替换,参数以列表或元组的形式给出。例如:在ch14中插入值(?,?)。
format 使用与 printf() 相同的类型格式,并且不支持指定参数的 Python 扩展。需要列表或元组进行转换。例如,insert into ch14values(%d,%s)
numeric指定数字样式。命令字符串中的每个数据位都替换为冒号后跟数字(数字以 1 开头),参数以列表或元组的形式给出。例如,插入 ch14 值(:1, :2)
named 表示命名样式。与数字类似,但在冒号后面使用名称而不是数字。带一本字典进行转换。例如:insert in ch14 value(:number, :text)
pyformat支持python风格参数,带有字典进行转换。例如:在 ch14 中插入值(%(number)d, %(text)s)。?
15 十五

(1)一一执行插入

("插入测试值(12,'十二')")
("插入测试值(13, '十三')" )
("插入测试值(14,'十四')")
("插入测试值(15,'十五')")

这个方法太低效了。

(2)executemany() 函数接受一条指令和指令执行记录列表。列表中的每条记录都是一个列表或字典。

导入 psycopg2
打印“连接到测试”
dbh=('dbname=testuser=postgres')
打印“连接成功”
cur=()
rows = ( { 'num': 0, 'text': '零'},
{'num': 1, 'text': '第一项'},
{'num': 2, 'text': '项目二'},
{'num': 3, 'text': '三'})
Many("插入测试值​​(%(num)d, %(text)s) " , rows )
()
()

executemany() 的主要缺点是必须在执行指令之前将所有记录放入内存中。如果数据很大,这会是一个问题,因为它占用了系统的所有内存资源。如果executemany()不能满足需求,除了execute()之外,仍然可以实现性能优化。根据db-api的描述,数据库后端可以通过定期调用execute()来进行优化。但第一个参数必须指向同一个对象,而不是指向包含相同值的字符串,即内存中的同一个字符串对象。与executemany()一样,这不能保证优化,并且不能期望execute()比executemany()运行得更快。但如果无法使用executemany(),这是最好的选择。

6。 fetchall、fetchmany、fetchone 获取数据

fetchall(self):获取所有返回的结果行。

fetchmany(self, size=none):接收返回结果行的大小。如果size的值大于返回的结果行数,则返回数据。

fetchone(self):返回结果行。

7。获取元数据(metadata)

元数据的英文名称是“metadata”,意思是“关于数据的数据”。如上例所示,元数据结果为:

column(name='id', type_code=23, display_size=none, external_size=4, precision=none, scale=none, null_ok=none)
column (name='文件名',type_code=1043,display_size=none,internal_size=255, precision=none,scale=none,null_ok=none)

导入psycopg2

打印“连接到bbstime”

dbh = ('dbname=bbstime user=postgres')

print "连接成功"

cur=()

("从asd中选择*")

对于cur.description中的列:
print column

()

8. 计算行数
有两种方法,一种是使用 len(),另一种是使用 rowcount。

import psycopg2
print "正在连接 bbstime"
dbh=('dbname=bbstime user=postgres')
print "连接成功"
cur=()
(" select * from test")
rows=()
print len(rows)#使用len计算行数
print "rows:",使用rowcount计算行数

版权声明

本文仅代表作者观点,不代表Code前端网立场。
本文系作者Code前端网发表,如需转载,请注明页面地址。

发表评论:

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

热门