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) |