SQLAlchemy初始化
1 | from sqlalchemy import create_engine |
SQLAlchemy创建连接
Engine
engine 的定义包含了三部分的内容:
- 具体数据库类型的实现
- 连接池
- 策略(即engine自己的实现)
所谓的数据库类型即是MYSQL , Postgresql , SQLite 这些不同的数据库.
一般创建 engine 是使用create_engine方法:
1 | engine = create_engine('postgresql+psycopg2://scott:tiger@localhost/mydatabase') |
对于这个字符串, SQLAlchemy 提供了工具可用于处理它:
1 | # -*- coding: utf-8 -*- |
create_engine 函数有很多的控制参数, 这个后面再详细说.
Engine的策略
create_engine的调用, 实际上会变成strategy.create的调用. 而strategy就是engine的实现细节. strategy可以在create_engine调用时通过strategy参数指定, 目前官方的支持有三种:
- plain, 默认的
- threadlocal, 连接是线程局部的
- mock, 所有的 SQL 语句的执行会使用指定的函数
mock 这个实现, 会把所有的 SQL 语句的执行交给指定的函数来做, 这个函数是由create_engine的 executor 参数指定:
1 | def f(sql, *args, **kargs): |
各数据库实现
各数据库的实现在 SQLAlchemy 中分成了两个部分, 一是数据库的类型, 二是具体数据库中适配的客户端实现. 比如对于 Postgresql 的访问, 可以使用psycopg2, 也可以使用pg8000:
1 | s = 'postgresql+psycopg2://test@localhost:5432/bbcustom' |
具体的适配工作, 是需要在代码中实现一个 Dialect 类来完成的. 官方的实现在 dialects 目录下.
获取具体的 Dialect 的行为, 则是前面提到的URL对象的get_dialect方法.create_engine时你单传一个字符串,SQLAlchemy自己也会使用make_url得到一个URL的实例).
连接池
SQLAlchemy 支持连接池, 在create_engine时添加相关参数即可使用.
- pool_size:连接数
- max_overflow:最多多几个连接
- pool_recycle:连接重置周期
- pool_timeout:连接超时时间
连接池效果:
1 | # -*- coding: utf-8 -*- |
连接池的实现, 在create_engine调用时也可以指定:
1 | from sqlalchemy.pool import QueuePool |
还有:
1 | from sqlalchemy.pool import NullPool |
或者仅仅是获取连接的方法:
1 | import sqlalchemy.pool as pool |
连接池可以被单独使用:
1 | import sqlalchemy.pool as pool |
连接池可以被多个 engine 共享使用:
1 | e = create_engine('postgresql://', pool=mypool) |