python数据库编程基本操作与SQL

将学习 Python 的数据库 API,并了解如何使用 Python 访问关系数据库。访问数据库包括直接通过数据库接口访问和使用 ORM 访问两种方式。其中使用 ORM 访问的方式不需要显式给出 SQL 命令,但也能完成相同的任务。

《Python核心编程》

第 6 章 数据库编程

你真的为你儿子起名叫Robert’);
DROP TABLE Students;–吗?

—Randall Munroe,XKCD,2007 年 10 月

本章内容:

  • 简介;
  • Python 的 DB-API;
  • 对象关系映射(ORM);
  • 非关系数据库;
  • 相关文献。

本章会讨论如何使用 Python 与数据库进行通信。文件或简单的持久化存储可以满足一些小应用的需求,而大型服务器或高数据容量的应用则需要更加成熟的数据库系统。本章会对关系数据库、非关系数据库以及对象关系映射(ORM)进行介绍。

  • 6.1简介

本节会对数据库的需求进行讨论,提出结构化查询语言(SQL),并介绍  Python  的数据库应用编程接口(API)。

6.1.1 持久化存储

在任何应用中,都需要持久化存储。一般有 3 种基础的存储机制:文件、数据库系统以及一些混合类型。这种混合类型包括现有系统上的 API、ORM、文件管理器、电子表格、配置文件等。

Core Python Language Fundamentals Core Python Programming 的“Files”一章讨论了两种持久化存储,一种是使用普通文件或 Python 的特定文件进行访问,另一种是使用数据库管理器(DBM)访问。其中,DBM 是一种比较古老的 UNIX 持久化存储机制,它基于文件, 包括:*dbm、dbhash/bsddb 文件、shelve(pickle 和  DBM 的组合),以及使用类似字典的对象接口。

当文件或创建的数据存储系统不适用于大项目时,需要转而使用数据库,这种情况正是本章所关注的内容。在这种情况下,你需要做出很多决定。因此,本章将介绍数据库基础,并展示尽可能多的选择(以及如何让其在 Python 中运转起来),以便你能够做出正确的决定。我们首先会从 SQL 和关系数据库开始,因为它们目前依旧是持久化存储中最流行的解决方案。

6.1.2 数据库基本操作和 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;
GRANT ALL ON test.* to user(s);

第一行创建了一个名为“test”的数据库,假设你是数据库的管理员,第二行语句可以为指定用户(或所有用户)提升权限,以便他们可以执行下述数据库操作。

使用数据库

USE test;

如果你已经登录一个数据库系统,但还没有选择你希望使用的数据库,这条简单的语句可以让你指定一个数据库,用来执行数据库操作。

删除数据库

DROP DATABASE test;

这条简单的语句可以从数据库中移除所有表和数据,并将其从系统中删除。

创建表

CREATE TABLE users (login VARCHAR(8), userid INT, projid INT);

这条语句创建一个新表,其中包含字符串列 login,以及两个整型列:userid 和 projid。

删除表

DROP TABLE users;

这条简单的语句可以删除数据库中的一个表,并清空其中的所有数据。

插入行

INSERT INTO users VALUES('leanna', 2111, 1);

可以使用 INSERT 语句向数据库中插入一个新行。需要指定表名以及其中每列的值。对于本例而言,字符串“leanna”对应于 login 参数,而 2111 和 1 分别对应于 userid 和 projid。

更新行

UPDATE users SET projid=4 WHERE projid=2; 
UPDATE users SET projid=1 WHERE userid=311;

为了修改表中已经存在的行,需要使用 UPDATE 语句。使用 SET 来确定要修改的列, 并提供条件来确定要修改的行。在第一个例子中,所有“project ID”(即 projid)为 2 的用户需要改为 4。而在第二个例子中,将指定用户(这里是 UID 为 311 的用户)移到编号为#1 的项目组中。

删除行

DELETE FROM users WHERE projid=%d; DELETE FROM users;

为了删除表中的行,需要使用 DELETE FROM 命令,指定准备删除的行的表名以及可选的条件。如果没有这个条件,就会像第二个例子一样,把所有行都删除了。

既然你对数据库的基本概念已经有了一个大致的了解,这就会使本章剩余部分及其示例的学习变得更加简单。如果你还需要额外的帮助,有很多数据库教程书籍可供参考。

6.1.3 数据库和Python

下面我们将学习 Python 的数据库 API,并了解如何使用 Python 访问关系数据库。访问数据库包括直接通过数据库接口访问和使用 ORM 访问两种方式。其中使用 ORM 访问的方式不需要显式给出 SQL 命令,但也能完成相同的任务。

诸如数据库原理、并发性、模式、原子性、完整性、恢复、比较复杂的左连接、触发器、查询优化、事务性、存储过程等主题都不在本书要讲解的范围之内,因此本章中不会对其进行讨论,而是直接在 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 语言库的接口。

图 6-1 应用与数据库的多层通信。第一个框一般是 C/C++程序,而在Python 中应用程序使用 DB-API 兼容的适配器。ORM 可以通过处理数据库具体细节来简化应用

作者:

喜欢围棋和编程。

 
发布于 分类 编程标签

发表评论

电子邮件地址不会被公开。