(点击
上方蓝字
,快速关注我们)
译文:伯乐在线专栏作者 - Namco
英文:Paul Johnston
如有好文章投稿,请点击 → 这里了解详情
如需转载,发送「转载」二字查看说明
最近,我见到了很多针对 ORM 的抨击,但是我觉得有些批评是莫须有的。我本人就是 SQLAlchemy 的忠实拥趸。在我的项目里很多地方都用到了 SQLAlchemy,我也为 SQLAlchemy 项目贡献了一些代码。这篇文章里,我会阐述你应当爱上 SQLAlchemy 的10个理由。说实话,除了 SQLAlchemy 以外还有很多优秀的 ORM,我所阐述的大部分理由同样适用于它们。但是 SQLAlchemy 是我的最爱。
1、用应用程序代码定义数据库模式
SQLAlchemy 允许你使用 Python 代码来定义数据库模式(schema)。下面是一个电子商务网站的例子,一个订单就代表一条记录。
class
OrderItem
(
Base
)
:
id
=
Column
(
Integer
,
primary_key
=
True
)
order
=
many_to_one
(
'Order'
)
product
=
many_to_one
(
'Product'
)
quantity
=
Column
(
Integer
)
定义数据库模式的 Python 代码在 SQLAlchemy 中叫做模型(model)。因为这些模型都是用 Python 的类实现的,所以你可以添加自己的类方法。这样可以把相关功能放在一起,方便维护。
class
Order
(
Base
)
:
...
def
update_stock
(
self
)
:
for
item
in
self
.
items
:
item
.
product
.
stock
-=
item
.
quantity
上面这个例子说明了,在 SQLAlchemy 中数据库的模式也可以通过版本控制来维护。所以使用SQLAlchemy 的同时,你也可以享受到版本控制的诸多便利:比如版本追踪、标签、
追溯(blame)
等等。
2、自动同步模型到数据库模式
Alembic 是 SQLAlchemy 的一个数据库管理插件。当你修改模型的时候,Alembic 可以自动更新数据库模式。使用 Alembic 来做一些添加表或者列的小改动是非常便捷快速的。
$
alembic upgrade head
INFO
[
alembic
.
context
]
Context
class
PostgresqlContext
.
INFO
[
alembic
.
context
]
Will assume transactional
DDL
.
INFO
[
alembic
.
context
]
Running upgrade
None
->
1975ea83b712
尽管在开发环境中自动同步非常方便,但是大多数人还是想在生产环境中采用更稳妥一些的方式。这一点 Alembic 也想到了,它可以自动生成修改的脚本,数据库管理员可以在检视脚本之后再应用到生产环境的数据库上。
3、Pythonic 的代码风格让你的代码更易读
SQLAlchemy 使用更 Pythonic 的方式表示数据库关系,这对于阅读和编写代码来说是非常方便的。我们来看下面这个例子,这个例子可以打印出在一个订单中的所有产品。
for
item
in
order.items:
print
(
item
.
product
.
name
,
item
.
quantity
)
代码非常的简单易读,但是打通了两个数据库,执行了 JOIN 连接查询。order.items 是一对多的关系,SQLAlchemy 会自动加载 OrderItem 中和这个订单相关的对象。item.product 则储存的是多对一的关系,SQLAlchemy 会自动加载对应的产品。
SQLAlchemy 也可以运用类。如果应用修改了一个有映射的字段,对象会自动请求写入数据库。这个功能使编写应用逻辑的时候没有了后顾之忧。
4、用 Python 构建查询语句
类似用主键获取对象这种简单查询只需要很少的代码:
order = session.query(Order).get(order_id)
使用 Python 的查询语法,我们可以实现更复杂的查询。比如下面的例子,我要查找两天以前的有效订单:
overdue_orders
=
session
.
query
(