教土豆学计算机
SQLALchemy is a database toolkit and Object Relational Mapper for the Python, first introduced in 2005.
SQLALchemy 是在 2005 年开始的一个 ORM 库, 使用 Python 实现. 支持 MySQL, Postgresql, Oracle, MS-SQL, SQLite 等众多数据库

SQLALchemy consists of a Core and separate ORM component.
The Core offers a full SQL expression language that allows Pythonic construction of SQL constructs that render directly to SQL strings for a target database, returning result sets that are essentially enhanced DBAPI cursors.
+---------------------------------------+
| Session |
| |
| +----------+ |
| new | | |
| +----------+ |
| |
| +----------+ |
| dirty | | |
| +----------+ | +------+
| | | |
| +----------+ | +------------------+ | |
| deleted | | | | DBAPI Connection |----| |
| +----------+ | +------------------+ | DB |
| | | DBAPI Connection |----| |
| +----------+ | +------------------+ | |
| identity_map | | | | DBAPI Connection |----| |
| +----------+ | +------------------+ | |
| | ^ ^ +------+
| +--------------------+ | | |
| transaction |Session Transaction | | | |
| + | | | |
| | < Connection > ------------->----+ |
| +--------------------+ | |
| | |
| +----------+ | |
| bind |< Engine >| | ^
| +----------+ | |
+------------------|--------------------+ |
| |
V |
+----------------+ +--------------------+ |
| Engine | | Pool | |
| +----------+ | | | |
| | < Pool > |----------->+--------------------+ |
| +----------+ | |< DBAPI Connection >|-->-+
+----------------+ +--------------------+

from sqlalchemy import Integer, Column
from sqlalchemy.ext.declarative import declarative_base
Base = declarative_base()
class A(Base):
__tablename__ = 'a'
id = Column(Integer, primary_key=True)
age = Column(Integer)
通过以上代码,我们就完成了对表 a 的 ORM, 看起来很简单
其中 declarative_base() 返回一个 base class (默认通过元类 DeclarativeMeta 构造); 这个 base class 会为其子类, 比如上面的 A, 提供一个 __init__, 它允许我们根据类成员实例化一个对象, 不用再辛苦的手写一个构造函数.
a = A(age=27)
另当创建新的子类继承自 Base 时, DeclarativeMeta 的构造函数会被调用, 后者将 A 中 Column 类型的成员替换成 InstrumentedAttribute (一个 data descriptor 数据描述符), 使得对类成员的访问最终演变成对 instance dictionary 的访问
# a.age = 23 ==> A.age.__set__(a, 23) ==> a.__dict__['age'] = 23
a.age = 23
借助于 Python 中的元类 metaclass 和数据描述符 data descriptor, 我们可以很轻易的定义一个 Model. 相对于 Java 中 mybatis 所做的繁琐工作, 此处省略一百字… :-)
… This pattern is where the system transparently keeps track of changes to objects and periodically flushes all those pending changes out to the database.
Sqlalchemy Official Site - 官方文档
SQLALchemy - The Architecture of Open Source Applications - SQLALchemy 架构