python基础教程(第三版)学习笔记(十三)

第十三章 数据库支持

本章讨论Python数据库API(一种连接到SQL数据库的标准化方式),并演示如何使用这个API 来执行一些基本的SQL。 本章使用的是简单数据库SQLite。介绍一些SQLite数据库知识。不要指望在本章得到多少数据库操作的具体知识。另外本章学习很大一部分基于PEP 249(https://www.python.org/dev/peps/pep-0249/) 因此还要多了解PEP 249 中关于PEP 249 标准下用Python操作数据库知识。

13.1 Python 数据库 API

本节概述有关该API的基础知识。

13.1.1 全局变量

所有与DB API2.0兼容的数据库模块都必须包含三个全局变量,它们描述了模块的特征。

apilevel 使用的Python DB API版本 ,是一个字符串常量,指出了使用的API版本,'1.0'或'2.0'。

threadsafety 模块的线程安全程度如何,是一个0~3(含)的整数。0表示线程不能共享模块,而3表 示模块是绝对线程安全的。1表示线程可共享模块本身,但不能共享连接,而2 表示线程可共享模块和连接,但不能共享游标(cursor ——记住这个单词)。

paramstyle 在SQL查询中使用哪种参数风格 。表示当你执行多个类似的数据库查询时,如何在SQL查询中插入参 数。'format'表示标准字符串格式设置方式(使用基本的格式编码),如在要插入参数的地方插 入%s。'pyformat'表示扩展的格式编码,即旧式字典插入使用的格式编码,如%(foo)s。除这些 Python风格外,还有三种指定待插入字段的方式:'qmark'表示使用问号,'numeric'表示使用:1 和:2这样的形式表示字段(其中的数字是参数的编号),而'named'表示使用:foobar这样的形式表 示字段(其中foobar为参数名)。

(不要懵了,其实以上的知识编写简单程序时, 不会用到它们。 )

13.1.2 异常

DB API定义了多种异常,让你能够细致地处理错误。

StandardError 所有异常的超类

Warning 继承StandardError 发生非致命问题时引发

Error继承 StandardError 所有错误条件的超类

InterfaceError继承 Error 与接口(而不是数据库)相关的错误

DatabaseError 继承Error 与数据库相关的错误的超类

DataError继承 DatabaseError 与数据相关的问题,如值不在合法的范围内

OperationalError 继承DatabaseError 数据库操作内部的错误

IntegrityError 继承DatabaseError 关系完整性遭到破坏,如键未通过检查

InternalError 继承DatabaseError 数据库内部的错误,如游标无效

ProgrammingError继承 DatabaseError 用户编程错误,如未找到数据库表

NotSupportedError继承 DatabaseError 请求不支持的功能,如回滚

异常知识在出现异常时查询就可以了,不可死记。

13.1.3 连接和游标

要使用底层的数据库系统,必须先连接到它,为此可使用名称贴切的函数connect。这个函 数接受多个参数,具体是哪些取决于要使用的数据库。

函数connect的常用参数 :

参 数 名 描 述 是否可选
dsn 数据源名称,具体含义随数据库而异
user 用户名
password 用户密码
host 主机名
database 数据库名称

函数connect的具体使用 形如:

conn = db.connect('host=locahost port=3306 user=foo password=bar databasee=baz  charset=utf8')

其中db为模块,参数host为主机名、port为主机端口,这样就获得了与数据库的联接。函数connect返回一个连接对象conn,表示当前到数据库的会话。连接对象支持以下的方法。

close() 关闭连接对象。之后,连接对象及其游标将不可用

commit() 提交未提交的事务——如果支持的话;否则什么都不做

rollback() 回滚未提交的事务(可能不可用)

cursor() 返回连接的游标对象

这里有两个常用方法一个是close()关闭联接;和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

使用游标形如:

cursor = conn.cursor()
  data_list=cursor. fetchmany(9) 
  ​
  '''
  等等对数据库进行一系列操作
  ​
  '''
  conn.commit()        # 提交事务,仅仅查询不需要此语句
  cursor.close()       # 关闭游标     
  conn.close()         # 关闭连接

以上语句只是演示,使用的模块不同格式不尽相同,但大体四步法,即连接、获取游标、使用游标对象的方法对数据库操作(提交事务)、关闭游标、关闭联接。

13.1.4 类型

对于插入到某些类型的列中的值,底层SQL数据库可能要求它们满足一定的条件。为了能够 与底层SQL数据库正确地互操作,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列

13.2 SQLite 和 PySQLite

为SQLite的小型数据库引擎。它不需要作为独立的服务器运行,且可直接使用本地文 件,而不需要集中式数据库存储机制。

较旧的 Python 版本,必须安装 PySQLite 才能使用 SQLite 数据库,可 从 https://github.com/ghaering/pysqlite 下载。 较新的 Python 版本,几乎可以肯定已经有 PySQLite 。使用模块sqlite3实现PySQLite。

(关于sqlitr3的操作参见sqliste3 — DB-API 2.0 interface for SQLite databases地址:https://pysqlite.readthedocs.io/en/latest/sqlite3.html,如不嫌简陋可参见我粗简译文。地址:https://blog.csdn.net/micorjun/article/details/83896280)

13.2.1 起步

要使用Python标准库中的SQLite,可通过导入模块sqlite3来导入它。然后,就可创建直接到 数据库文件的连接。为此,只需提供一个文件名(可以是文件的相对路径或绝对路径);如果指 定的文件不存在,将自动创建它。创建如无路径则仅临时保存在内存中,关闭编辑器数据库消失。

  import sqlite3
  conn = sqlite3.connect('somedatabase.db')  

接下来可从连接获得游标。

 curs = conn.cursor() 

这个游标可用来执行SQL查询。执行完查询后,如果修改了数据,务必提交所做的修改,这 样才会将其保存到文件中。

conn.commit() 

你可以(也应该)在每次修改数据库后都进行提交,而不是仅在要关闭连接前才这样做。要 关闭连接,只需调用方法close。

conn.close() 

13.2.2 数据库应用程序示例

1、创建并填充数据库表

 import sqlite3
  studs=[('张三','23','男','三班'),('李四','24','男','四班'),('王六妮','21','女','二班')]
  conn  =  sqlite3 .connect ('.\\foo.db' )
  c = conn.cursor()
  # 创建表
  c.execute('''create table food
  (name text, age int, sex text,
   classid real)
   ''')
  #输入数据
  stus = 'INSERT INTO food VALUES (?,?,?,?)'
  for line in studs:
      valu=list(line)
      c.execute(stus,valu)
  ​
  conn.commit()
  c.close()

数据库如下图:

2、搜索并处理结果

数据库使用起来非常简单:创建一条连接并从它获取一个游标;使用方法execute执行SQL 查询并使用诸如fetchall等方法提取结果。

  import sqlite3, sys
  ​
  conn = sqlite3.connect('.\\foo.db')
  curs = conn.cursor()
  query = 'SELECT * FROM "stocks"'
  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), end='\t')
  print("查询结束!")

查询结果:

C:\Users\xx\AppData\Local\Programs\Python\Python37\python.exe E:/pythonProjects/gui
SELECT * FROM "food"
name: 张三    age: 23    sex: 男    classid: 三班    name: 李四    age: 24    sex: 男    classid: 四班    name: 王六妮    age: 21    sex: 女    classid: 二班    查询结束!

Process finished with exit code 0


 

(待续)

猜你喜欢

转载自blog.csdn.net/micorjun/article/details/83902540