一,首先是安装
(pip安装):sudo pip install SQLAlchemy
(easyInstall):sudoeasy_install SQLAlchemy
二,创建链接
SQLAlchemy 的连接创建是 Lazy 的方式, 即在需要使用时才会去真正创建. 之前做的工作, 全是"定义".连接的定义是在 engine 中做的.
engine 的定义包含了三部分的内容, 一是具体数据库类型的实现, 二是连接池, 三是策略(即engine 自己的实现).
所谓的数据库类型即是 MYSQL , Postgresql , SQLite 这些不同的数据库.
一般创建 engine 是使用 create_engine
方法:
engine = create_engine('postgresql+psycopg2://scott:tiger@localhost/mydatabase')
参数字符串的各部分的意义:
dialect+driver://username:password@host:port/database + “?param=xxxx”,如字符集“charset=utf8”(这是中文字符乱码的解决方案)
对于这个字符串, SQLAlchemy 提供了工具可用于处理它:
# -*- coding: utf-8 -*- from sqlalchemy import create_engine from sqlalchemy.engine.url import make_url from sqlalchemy.engine.url import URL s = 'postgresql://test@localhost:5432/bbcustom' url = make_url(s) s = URL(drivername='postgresql', username='test', password="",host="localhost", port=5432, database="bbcustom") engine = create_engine(url) engine = create_engine(s) print engine.execute('select id from "user"').fetchall()
create_engine
函数有很多的控制参数, 这个后面再详细说.
三,连接池
SQLAlchemy 支持连接池, 在 create_engine
时添加相关参数即可使用.
- pool_size 连接数
- max_overflow 最多多几个连接
- pool_recycle 连接重置周期
- pool_timeout 连接超时时间
连接池效果:
# -*- coding: utf-8 -*- from sqlalchemy import create_engine from sqlalchemy.engine.url import make_url from sqlalchemy.engine.url import URL s = 'postgresql://test@localhost:5432/bbcustom' engine = create_engine(s, pool_size=2, max_overflow=0) from threading import Thread def f(): print engine.execute('select pg_sleep(5)').fetchall() p = [] for i in range(3): p.append(Thread(target=f)) for t in p: t.start()
连接池的实现, 在 create_engine
调用时也可以指定:
from sqlalchemy.pool import QueuePool engine = create_engine('sqlite:///file.db', poolclass=QueuePool)
还有:
from sqlalchemy.pool import NullPool engine = create_engine( 'postgresql+psycopg2://scott:tiger@localhost/test', poolclass=NullPool)
或者仅仅是获取连接的方法:
import sqlalchemy.pool as pool import psycopg2 def getconn(): c = psycopg2.connect(username='ed', host='127.0.0.1', dbname='test') # do things with 'c' to set up return c
engine = create_engine('postgresql+psycopg2://', creator=getconn)
连接池可以被单独使用:
import sqlalchemy.pool as pool import psycopg2 def getconn(): c = psycopg2.connect(username='ed', host='127.0.0.1', dbname='test') return c mypool = pool.QueuePool(getconn, max_overflow=10, pool_size=5) conn = mypool.connect() cursor = conn.cursor() cursor.execute("select foo")
连接池可以被多个 engine 共享使用:
e = create_engine('postgresql://', pool=mypool)