# SQLAlchemy 简介

> 原文： [http://zetcode.com/db/sqlalchemy/intro/](http://zetcode.com/db/sqlalchemy/intro/)

这是 SQLAlchemy 教程。 它涵盖了它。它涵盖了 SQLAlchemy SQL 工具包和对象关系映射器的基础。 在本教程中，我们将使用 PostgreSQL，MySQL 和 SQLite 数据库。

## SQLAlchemy

SQLAlchemy SQL 工具包和对象关系映射器是一组用于处理数据库和 Python 的综合工具。 它提供了一整套知名的企业级持久性模式，旨在实现高效和高性能的数据库访问。 SQLAlchemy 和 Django 的 ORM 是 Python 社区中使用最广泛的两个对象关系映射工具。

SQLAlchemy 具有三种处理数据库数据的方式：

*   原始 SQL
*   SQL 表达式语言
*   ORM

与许多其他 ORM（对象关系映射）工具不同，SQLAlchemy 允许使用纯 SQL 语句。 我们总是可以求助于原始 SQL。 SQL 表达式 API 允许您使用 Python 对象和运算符来构建 SQL 查询。 表达式 API 是纯 SQL 语句的抽象，处理数据库之间的各种实现差异。 SQLAlchemy 对象关系映射器提供了一种将用户定义的 Python 类与数据库表相关联的方法。 SQLAlchemy ORM 基于 SQL 表达式语言。

## SQLAlchemy 组件

SQLAlchemy 由几个组件组成。 引擎是任何 SQLAlchemy 应用的起点。 该引擎是数据库及其 API 的抽象。 它与连接池和方言组件一起使用，以将 SQL 语句从 SQLAlchemy 传递到数据库。 使用`create_engine()`函数创建引擎。 它可以用于直接与数据库进行交互，也可以传递给会话对象以使用对象关系映射器。

方言是 SQLAlchemy 用于与各种类型的 DBAPI 实现和数据库进行通信的系统。 所有方言都要求安装适当的 DBAPI 驱动程序。 SQLAlchemy 具有许多流行数据库系统的方言，包括 Firebird，Informix，Microsoft SQL Server，MySQL，Oracle，PostgreSQL，SQLite 或 Sybase。 从提供的连接字符串创建方言。

元数据由描述表和其他模式级对象的 Python 对象组成。 可以通过使用诸如表，列或外键之类的结构明确命名各种组件及其属性来表示数据库元数据。 SQLAlchemy 可以使用称为反射的过程轻松生成元数据。

在 ORM 内部，持久性操作的主要接口是会话。 会话建立与数据库的所有对话，并代表我们在其生命周期中已加载或与其关联的所有对象的容器。 它提供了获取查询对象的入口点，该对象使用会话对象的当前数据库连接将查询发送到数据库，将结果行填充到对象中，然后将这些对象存储在会话中。

## 装置

在这里，我们展示了如何在基于 Debian 的 Linux 系统上安装 SQLAlchemy 和其他必要的包。

```py
$ sudo apt-get install python-pip
$ sudo pip install SQLAlchemy

```

使用`pip` Python 包管理器，我们安装了 SQLAlchemy。

```py
$ sudo apt-get install python-psycopg2
$ sudo apt-get install python-mysqldb

```

我们为 PostgreSQL 和 MySQL 安装了 DBAPI 驱动程序。 SQLAlchemy 取决于这些模块。 `sqlite`模块随 Python 一起分发。

```py
$ sudo apt-get install mysql-server

```

上面的命令安装 MySQL 服务器。 有关其他安装说明，您可以查看 [MySQL Python 教程](/db/mysqlpython/)。

```py
$ sudo apt-get install postgresql

```

上面的命令安装 PostgreSQL 服务器。 有关其他说明，您可以查看 [PostgreSQL Python 教程](/db/postgresqlpythontutorial/)。

```py
$ sudo apt-get install sqlite3

```

最后，我们安装`sqlite3`命令行界面。

## SQLAlchemy 版本

在以下脚本中，我们检查 SQLAlchemy 的安装是否成功。

`sqlalchemy_version.py`

```py
#!/usr/bin/python
# -*- coding: utf-8 -*-

import sqlalchemy

print sqlalchemy.__version__

```

我们打印 SQLAlchemy 的版本。

```py
$ ./version.py 
1.0.8

```

当前使用的 SQLAlchemy 版本是 1.0.8。

## 使用的表

下面的 SQL 脚本创建在本教程中使用的表。

```py
sqlite> .read cars.sql

```

对于 SQLite 数据库，我们使用`.read`命令读取 SQL 脚本。

```py
mysql> source cars.sql

```

对于 MySQL 数据库，我们使用`source`命令读取 SQL 脚本。

```py
testdb=> \i cars.sql

```

对于 PostgreSQL 数据库，我们使用`\i`命令读取 SQL 脚本。

`cars.sql`

```py
-- SQL for the Cars table

BEGIN TRANSACTION;
DROP TABLE IF EXISTS Cars;

CREATE TABLE Cars(Id INTEGER PRIMARY KEY, Name TEXT, Price INTEGER);
INSERT INTO Cars VALUES(1, 'Audi', 52642);
INSERT INTO Cars VALUES(2, 'Mercedes', 57127);
INSERT INTO Cars VALUES(3, 'Skoda', 9000);
INSERT INTO Cars VALUES(4, 'Volvo', 29000);
INSERT INTO Cars VALUES(5, 'Bentley', 350000);
INSERT INTO Cars VALUES(6, 'Citroen', 21000);
INSERT INTO Cars VALUES(7, 'Hummer', 41400);
INSERT INTO Cars VALUES(8, 'Volkswagen', 21600);
COMMIT;

```

这是`Cars`表。

`authors_books.sql`

```py
-- SQL for the Authors & Books tables

BEGIN TRANSACTION;
DROP TABLE IF EXISTS Books;
DROP TABLE IF EXISTS Authors;

CREATE TABLE Authors(AuthorId INTEGER PRIMARY KEY, Name TEXT);
INSERT INTO Authors VALUES(1, 'Jane Austen');
INSERT INTO Authors VALUES(2, 'Leo Tolstoy');
INSERT INTO Authors VALUES(3, 'Joseph Heller');
INSERT INTO Authors VALUES(4, 'Charles Dickens');

CREATE TABLE Books(BookId INTEGER PRIMARY KEY, Title TEXT, AuthorId INTEGER, 
    FOREIGN KEY(AuthorId) REFERENCES Authors(AuthorId));
INSERT INTO Books VALUES(1,'Emma',1);
INSERT INTO Books VALUES(2,'War and Peace',2);
INSERT INTO Books VALUES(3,'Catch XII',3);
INSERT INTO Books VALUES(4,'David Copperfield',4);
INSERT INTO Books VALUES(5,'Good as Gold',3);
INSERT INTO Books VALUES(6,'Anna Karenia',2);
COMMIT;

```

这些是`Authors`和`Books`表。

## 数据来源

SQLAlchemy 的[文档](http://docs.sqlalchemy.org/en/rel_1_0/index.html)用于创建本教程。

本章是 SQLAlchemy 工具箱的简介。