最近正好在寻求一种Python的数据库ORM (Object Relational Mapper),SQLAlchemy (项目主页)这个开源项目进入了我的视线,本来想尝试着使用Django的ORM模块的,无奈Django的模块联系比较紧密,没能单独分拆下来,一定程度上说明Django自成体系的生态系统在给我们带来快速便捷的开发环境的同时牺牲了组装的灵活性。
初次学习,也没实质感觉到SQLAlchemy的好处,不过看其介绍的很多大公司均采用该项目,而且其支持的数据库还是蛮丰富的,所以我觉得花点时间研究还是值得的。不过令人遗憾的是关于SQLAlchemy的中文资料比较少,所以对于我们这种英语不佳的带来了一定的麻烦。
研究一个项目最好的办法就是阅读其官方提供的说明文档,当然很轻松就找到了SQLAlchemy的文档 (0.7)。文档的格式和大多数项目一样,有下载安装说明,有示例,有快速上手教程。不过我还是习惯下载个PDF慢慢研究。
下面就将我近期的阅读学习做个笔记,当然这个仅供参考,里面可能有自己的一些猜测和想法,不作权威依据,不当之处还希望指出。
1. 安装SQLAlchemy
安装部分不打算详细介绍,可以通过easy_install或者pip进行安装,命令如下:
代码如下:
easy_install SQLAlchemy
# 或者
pip install SQLAlchemy
代码如下:
python setup.py install
代码如下:
pip install --global-option='--without-cextensions' SQLAlchemy
# 或者setup.py方式
python setup.py --without-cextensions install
最后可以检验一下安装成果:
代码如下:
>>> import sqlalchemy
>>> sqlalchemy.__version__
0.7.0
2. 简单的查询
就像任何新语言都是从万能的'Hello World'开始一样,先简单体验一把SQLAlchemy,由于SQLAlchemy是管理数据库的,所以我们需要一个数据库,自从用了Python以后,一提到数据库,拿来做实验的首当其冲的就是Python自带的SQLite3,这次我们连SQLite的数据库文件都不需要指定了,直接创建一份基于内存的数据库,也就是说数据文件存放在内存中,便于我们下面的测试。
我们使用create_engine创建数据库连接引擎:
代码如下:
>>> from sqlalchemy import create_engine
>>> engine = create_engine('sqlite:///:memory:', echo=True)
create_engine()将会返回一个Engine引擎实例(instance),其代表着SQLAlchemy对于数据库的核心接口,其隐藏了各种数据库方言(dialect)的细节,实际上SQLAlchemy的底层是Python的DBAPI。
需要注意的是此时并没有实质上与数据库建立连接,什么时候才会与数据库真正建立连接呢?这个只会在你第一次查询数据库的时候发生。呃…这个有点像Lazy Loading (懒惰加载,延迟加载),也就是说我们需要真正操作数据库的时候才真正建立连接。SQLAlchemy很多地方用到了Lazyload,以后会有机会和大家介绍的。
接下来我们来执行第一条SQL语句,同时建立数据库连接:
代码如下:
>>> engine.execute("select 1").scalar()
1
Engine对于数据库连接的管理采取的是数据库连接池 (Pool),当连接第一次建立,SQLAlchemy将会将建立的连接放入内部的连接池中以便于随后的数据操作语句执行时复用。
当然关于Engine的用法并不是SQLAlchemy精彩的ORM部分,随后我们会介绍将Engine绑定到ORM,然后使用对象来操作数据库部分。