Python 数据库编程(简介)
本节会对数据库的需求进行讨论,提出结构化查询语言(SQL),并介绍Python 的数据库应用编程接口(API)。
简介
本节会对数据库的需求进行讨论,提出结构化查询语言(SQL),并介绍Python 的数据
库应用编程接口(API)。
持久化存储
在任何应用中,都需要持久化存储。一般有3 种基础的存储机制:文件、数据库系统以及
一些混合类型。这种混合类型包括现有系统上的API、ORM、文件管理器、电子表格、配置文
件等。
Core Python Language Fundamentals 或Core Python Programming 的“Files”一章讨论了
两种持久化存储,一种是使用普通文件或Python 的特定文件进行访问,另一种是使用数据库
管理器(DBM)访问。其中,DBM 是一种比较古老的UNIX 持久化存储机制,它基于文件,
包括:*dbm、dbhash/bsddb 文件、shelve(pickle 和DBM 的组合),以及使用类似字典的对
象接口。
当文件或创建的数据存储系统不适用于大项目时,需要转而使用数据库,这种情况正是本
章所关注的内容。在这种情况下,你需要做出很多决定。因此,本章将介绍数据库基础,并展
示尽可能多的选择(以及如何让其在Python 中运转起来),以便你能够做出正确的决定。我们
首先会从SQL 和关系数据库开始,因为它们目前依旧是持久化存储中最流行的解决方案。
数据库基本操作和SQL
在深入了解数据库以及如何在Python 中使用它们之前,我们先会给出一个快速的介绍(如
果你已经有一些经验,可以将其作为复习),包括一些基础的数据库概念以及SQL 语句等。
底层存储
数据库通常使用文件系统作为基本的持久化存储,它可以是普通的操作系统文件、专用
的操作系统文件,甚至是原始的磁盘分区。
用户接口
大多数数据库系统提供了命令行工具,可以用其执行SQL 语句或查询。此外还有一些
GUI 工具,使用命令行客户端或数据库客户端库,向用户提供更加便捷的界面。
数据库
一个关系数据库管理系统(RDBMS)通常可以管理多个数据库,比如销售、市场、用
户支持等,都可以在同一个服务端(如果RDBMS 基于服务器,可以这样。不过一些简单
的系统通常不是基于服务器的)。在本章将要看到的例子中,MySQL 是一种基于服务的
RDBMS,因为它有一个服务器进程始终运行以等待命令行输入;而SQLite 和Gadfly 则不
会运行服务器。
组件
数据库存储可以抽象为一张表。每行数据都有一些字段对应于数据库的列。每一列的表
定义的集合以及每个表的数据类型放到一起定义了数据库的模式(schema)。
数据库可以创建(create)和删除(drop),表也一样。往数据库里添加新行叫做插入(insert),
修改表中已存在的行叫做更新(update),而移除表中已存在的行叫做删除(delete)。这些动
作通常称为数据库命令或操作。使用可选的条件请求获取数据库中的行称为查询(query)。
当查询一个数据库时,可以一次性取回所有结果(行),也可以逐条遍历每个结果行。一
些数据库使用游标的概念来提交SQL 命令、查询以及获取结果,不管是一次性获取还是逐行
获取都可以使用该概念。
SQL
数据库命令和查询操作是通过SQL 语句提交给数据库的。虽然并非所有数据库都使用
SQL 语句,但是大多数关系数据库使用。下面是一些SQL 命令示例。请注意,大部分数据
库都是不区分大小写的,尤其是针对数据库命令而言。一般来说,对数据库关键字使用大
写字母是最为广泛接受的风格。大多数命令行程序需要一条结尾的分号(;)来结束这条SQL
语句。
创建数据库
CREATE DATABASE test;
GR ANT ALL ON test.* to user(s);
第一行创建了一个名为“test”的数据库,假设你是数据库的管理员,第二行语句可以为
指定用户(或所有用户)提升权限,以便他们可以执行下述数据库操作。
使用数据库
US E test;
如果你已经登录一个数据库系统,但还没有选择你希望使用的数据库,这条简单的语句
可以让你指定一个数据库,用来执行数据库操作。
删除数据库
DR OP DATABASE test;
这条简单的语句可以从数据库中移除所有表和数据,并将其从系统中删除。
创建表
CR EATE TABLE users (login VARCHAR(8), userid INT, projid INT);
这条语句创建一个新表,其中包含字符串列login,以及两个整型列:userid 和projid。
删除表
DR OP TABLE users;
这条简单的语句可以删除数据库中的一个表,并清空其中的所有数据。
插入行
IN SERT INTO users VALUES('leanna', 2111, 1);
可以使用INSERT 语句向数据库中插入一个新行。需要指定表名以及其中每列的值。对
于本例而言,字符串“leanna”对应于login 参数,而2111 和1 分别对应于userid 和projid。
更新行
UPDATE users SET projid=4 WHERE projid=2;
UP DATE users SET projid=1 WHERE userid=311;
为了修改表中已经存在的行,需要使用UPDATE 语句。使用SET 来确定要修改的列,
并提供条件来确定要修改的行。在第一个例子中,所有“project ID”(即projid)为2 的用户
需要改为4。而在第二个例子中,将指定用户(这里是UID 为311 的用户)移到编号为#1 的
项目组中。
删除行
DELETE FROM users WHERE projid=%d;
DE LETE FROM users;
为了删除表中的行,需要使用DELETE FROM 命令,指定准备删除的行的表名以及可选
的条件。如果没有这个条件,就会像第二个例子一样,把所有行都删除了。
既然你对数据库的基本概念已经有了一个大致的了解,这就会使本章剩余部分及其示例
的学习变得更加简单。如果你还需要额外的帮助,有很多数据库教程书籍可供参考。
数据库和Python
诸如数据库原理、并发性、模式、原子性、完整性、恢复、比较复杂的左连接、触发器、
查询优化、事务性、存储过程等主题都不在本书要讲解的范围之内,因此本章中不会对其进
行讨论,而是直接在Python 应用中使用。本章将介绍如何在Python 框架下对RDBMS 进行
存储和获取数据的操作。之后你可以决定使用哪种方式更适合于你当前的项目或应用,而示
例代码的学习可以让你更加快速地起步。如果你需要将Python 应用与某种数据库系统结合起
来,我们的目标就是能够让你尽快掌握所有相关的事情。
我们还会打破只使用“功能齐备”的Python 标准库的模式(尽管我们的最初目标是只使
用标准库)。可以明确的是,在Python 的领域中,与数据库协同工作已经变成日常应用开发
中的一个核心组件。
作为一名软件工程师,到目前为止的职业生涯中,你可能还没学习数据库相关的一些
知识,比如:如何使用数据库(命令行和/或GUI),如何使用SQL 语句获取数据,如何
添加或更新数据库中的信息等。如果Python 是你的编程工具,一旦你向Python 应用中添
加了数据库访问,就会使很多麻烦的工作由Python 为你代劳了。首先我们会描述什么是
Python 的数据库API,或者说是DB-API,然后会给出一些符合这一标准的数据库接口的
例子。
我们将展示几个使用流行的开源RDBMS 的例子。不过,我们不会对开源产品和商业产
品之间的对比进行讨论。如果要适配其他RDBMS,使用方法也会非常直接。此外,有一个
数据库需要特别提及,这就是Aaron Watter 的Gadfly,因为这是一个完全使用Python 编写的
简单的RDBMS。
在Python 中数据库是通过适配器的方式进行访问的。适配器是一个Python 模块,使用
它可以与关系数据库的客户端库(通常是使用C 语言编写的)接口相连。一般情况下会推荐
所有的Python 适配器应当符合Python 数据库特殊兴趣小组(DB-SIG)的API 标准。适配器
将会是本章中首先要讨论的主题。
图6-1 所示为编写Python 数据库应用的结构,包括使用和没有使用ORM 的情况。从图
6-1 中可以看出,DB-API 是连接到数据库客户端的C 语言库的接口。
更多推荐
所有评论(0)