【呆鸟译Py】玩转SQLAlchemy 02 - 安装与关联数据库

96
呆鸟的简书
1.6 2018.12.11 14:12* 字数 1469
玩转SQLAlchemy-02

玩转SQLAlchemy 01 - 简介
玩转SQLAlchemy 02 - 安装与关联数据库
玩转SQLAlchemy 03 - 数据类型


安装 SQLAlchemy

pip install SQLAlchemy
警告

从 SQLAlchemy 1.1 版开始,用 setuptools 安装 SQLAlchemy 需要使用 setup.py 文件,安装命令为 python setup.py install,具体方式不再详述,请参照 SQLAlchemy 官方文档;

还是从 1.1 版开始 SQLAlchemy 已经不再支持用 distutils 安装了。

SQLAlchemy 支持 C 语言扩展,可以运行更快、内存利用更优,安装时, SQLAlchemy 会查找操作系统是否有没有安装 C 语言编译器,如果没有 C 语言编译器,就会禁用 C 语言插件,并输出警告信息;如果安装了 C 语言编译器,就会自动创建相关支持。

如果不想安装 C 语言扩展插件,可使用 export DISABLE_SQLALCHEMY_CEXT=1; python setup.py install 语句。不过,禁用 C语言扩展插件会降低 SQLAlchemy 运行效率,如果以后需要使用 C 语言扩展插件优化代码时,需要提前测试。

警告

1.1 版已经移除了之前的 global-option=--without-cextensions 语句。

检查 SQLAlchemy 版本

使用sqlalchemy.__version__命令可以查看 SQLAlchemy 的版本。

import sqlalchemy

sqlalchemy.__version__

安装数据库驱动

SQLAlchemy 内置了 SQLite3,无需安装驱动。本文为了操作方便,使用的都是 SQLite 数据库。

除了SQLite 之外,SQLAlchemy 还支持MySQL、PostgreSQL、Oracle 等主流数据库,但是,关联这些数据库需使用符合 Python DBAPI 规范的驱动, 本文只介绍如何安装 与关联 PyMySQL。

首先,用 pip 命令安装 PyMySQL:

pip install PyMySQL

然后,再用以下语句进行关联:

mysql+pymysql://<username>:<password>@<host>/<dbname>[?<options>]
提示

因为密码操作方式的变化, SQLAlchemy 仅支持 MySQL 4.1及以上版本,并且,某些特殊语句类型仅在特定版本的 MySQL 里生效。如果发现 SQLAlchemy 某些特定组件或函数在处理 MySQL 时不能正常运行,请查阅 MySQL 的文档。

安装好 SQLAlchemy 和 DBAPI 后,就可以创建 SQLAlchemy 与 数据库的连接引擎了。

关联数据库

用 SQLAlchemy 连接数据库需要创建 engine 对象。engine 对象提供对后端数据库的统一访问接口,让 Python 代码不用顾及不同数据库与 DBAPI 之间的区别。

连接字符串的内容

SQLAlchemy 提供了 create_engine 函数,只要设置连接字符串和可选的关键字就可以创建 engine 对象。连接字符串包括以下信息:

  • 数据库的类型,如,SQLite、MySQL 等;
  • 方言,如,Psycopg2、 PyMySQL 等;
  • 认证信息,如用户名、密码,可选选项;
  • 数据库的位置,SQLite 是一个文件,MySQL 等其它数据库为服务器的主机名称;
  • 数据库服务器端口,可选选项;
  • 数据库名称,可选选项。

创建连接 MySQL 的 engine 实例

虽然本文不打算使用 MySQL, 但是鉴于实际生产环境中 MySQL 大行其道,还是有必要了解一下如何为远程服务器上的 MySQL 数据库创建 engine 实例。

from sqlalchemy import create_engine

engine = create_engine('mysql+pymysql://刘备:魏蜀吴我最大'\ # 1
'@mysql001.monster.internal/students', pool_recycle=3600) # 2
  1. 为了看得清楚,这里用的是中文,‘刘备’是用户名,‘魏蜀吴我最大’是密码;
  2. pool_recylce 关键字说明 MySQL 多久后自动回收连接,默认情况下,空闲 8 小时后,MySQL 会关闭连接。为了避免这种情况,在创建 engine 实例时要使用关键字 pool_recycle=3600

创建连接 SQLite 的 engine 实例

SQLite 的连接字符串指定了文件和存储位置。下面的代码,定义了 students.db 的数据库,并且展示了多种为 SQLite 创建引擎的方式。

from sqlalchemy import create_engine # 1

engine1 = create_engine('sqlite:///:memory:', echo = True) # 3
engine2 = create_engine('sqlite:///students.db') # 2
engine3 = create_engine('sqlite:////home/ThreeKids/students.db') # 4
engine4 = create_engine('sqlite:///c:\\Users\\ThreeKids\\students.db') # 5
  1. 从 SQLAlchemy 导入 create_engine 函数;
  2. 定义内存数据库;
  3. 用相对路径,将 students.db 存在与.py文件相同的文件夹;
  4. 指定在 unix 系统里 students.db 文件的完整路径;
  5. 指定在 Windows 系统里students.db 文件的完整路径。注意:在 Windows 里,连接字符串要写成 engine4 里的样子,除非用原始字符串(r''),否则使用\\才能正常转义文件路径的字符串。
提示

create_engine 函数返回的是 engine 实例,不过,调用查询等需要连接的行为前,SQLAlchemy 不会真正连接数据库。

create_engine 函数的可选关键字:

  • echo

这个关键字记录引擎处理的动作,诸如 SQL 语句及其参数。默认为 False,在测试环境下可以设置为 True,在生产环境下要设置为 False

  • encoding

这个关键字定义 SQLALchemy 使用的字符串编码,默认为 utf-8,大对数 DBAPI 都默认支持这一编码,但它不会定义后端数据库自身使用的编码类型。

  • isolation_level

这个关键字指明 SQLAlchemy 使用的隔离层级。比如,PyMySQL 的 InnoDB 数据库默认值为 REPEATABLE READ

提示

isolation_level 关键字可以为任意给定的 DBAPI 设定隔离级别。

  • pool_recycle

这个关键字设置了回收数据库连接及超时的时限。这点对于 MySQL 尤为重要,因为 MySQL 的默认值为 -1,即没有超时。

连接数据库

初始化 engine 实例后,即可调用 connect 方法打开数据库连接。

connection = engine.connect()

连接好数据库后,就可以用 SQLALchemy 操控数据库了。不过,下一篇文章先为大家介绍 SQLALchemy 的数据类型。


玩转SQLAlchemy 01 - 简介
玩转SQLAlchemy 02 - 安装与关联数据库
玩转SQLAlchemy 03 - 数据类型


呆鸟译Py