SQLAlchemy 简介
最后修改于 2020 年 7 月 6 日
这是 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 由几个组件组成。Engine 是任何 SQLAlchemy 应用程序的起点。Engine 是数据库及其 API 的抽象。它与连接池和 Dialect 组件一起工作,将 SQL 语句从 SQLAlchemy 传递到数据库。引擎使用 create_engine 函数创建。它可以用于直接与数据库交互,也可以传递给 Session 对象以使用对象关系映射器。
Dialect 是 SQLAlchemy 用于与各种类型的 DBAPI 实现和数据库通信的系统。所有方言都需要安装适当的 DBAPI 驱动程序。SQLAlchemy 具有许多流行数据库系统的方言,包括 Firebird、Informix、Microsoft SQL Server、MySQL、Oracle、PostgreSQL、SQLite 或 Sybase。Dialect 从提供的连接字符串创建。
MetaData 由描述表和其他模式级对象的 Python 对象组成。数据库元数据可以通过显式命名各种组件及其属性来表达,使用 Table、Column 或 ForeignKey 等构造。MetaData 可以通过 SQLAlchemy 使用称为反射的过程轻松生成。
在 ORM 内部,持久化操作的主要接口是 Session。Session 建立了与数据库的所有对话,并代表了我们在其生命周期中加载或与之关联的所有对象的容器。它提供了获取 Query 对象的入口点,该对象使用 Session 对象的当前数据库连接将查询发送到数据库,将结果行填充到对象中,然后将这些对象存储在 Session 中。
安装
在这里,我们展示了如何在基于 Debian 的 Linux 系统上安装 SQLAlchemy 和其他必要的软件包。
$ sudo apt-get install python-pip $ sudo pip install SQLAlchemy
使用 pip Python 包管理器,我们安装 SQLAlchemy。
$ sudo apt-get install python-psycopg2 $ sudo apt-get install python-mysqldb
我们为 PostgreSQL 和 MySQL 安装 DBAPI 驱动程序。 SQLAlchemy 依赖于这些模块。 sqlite 模块随 Python 一起分发。
$ sudo apt-get install mysql-server
以上命令安装 MySQL 服务器。 有关其他安装说明,您可以查看 MySQL Python 教程。
$ sudo apt-get install postgresql
以上命令安装 PostgreSQL 服务器。 有关其他说明,您可以查看 PostgreSQL Python 教程。
$ sudo apt-get install sqlite3
最后,我们安装 sqlite3 命令行界面。
SQLAlchemy 版本
在以下脚本中,我们检查 SQLAlchemy 的安装是否成功。
#!/usr/bin/python # -*- coding: utf-8 -*- import sqlalchemy print sqlalchemy.__version__
我们打印 SQLAlchemy 的版本。
$ ./version.py 1.0.8
当前使用的 SQLAlchemy 版本是 1.0.8。
使用的表
以下 SQL 脚本创建本教程中使用的表。
sqlite> .read cars.sql
对于 SQLite 数据库,我们使用 .read 命令读取 SQL 脚本。
mysql> source cars.sql
对于 MySQL 数据库,我们使用 source 命令读取 SQL 脚本。
testdb=> \i cars.sql
对于 PostgreSQL 数据库,我们使用 \i 命令读取 SQL 脚本。
-- 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 表。
-- 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 的 文档 用于创建本教程。
本章介绍了 SQLAlchemy 工具包。