专栏名称: Python开发者
人生苦短,我用 Python。伯乐在线旗下账号「Python开发者」分享 Python 相关的技术文章、工具资源、精选课程、热点资讯等。
目录
相关文章推荐
Python爱好者社区  ·  “给我滚出贵大!”郑强出任贵州大学校长,打算 ... ·  3 天前  
Python爱好者社区  ·  节后第一个私活,赚了3w ·  2 天前  
Python爱好者社区  ·  DeepSeek 最新中国大学排名 ·  昨天  
Python开发者  ·  “李飞飞团队50 美元炼出 ... ·  4 天前  
Python爱好者社区  ·  史上最强!PINN杀疯了 ·  4 天前  
51好读  ›  专栏  ›  Python开发者

爱上 SQLAlchemy 的 10 个理由

Python开发者  · 公众号  · Python  · 2017-02-07 20:09

正文

(点击 上方蓝字 ,快速关注我们)


译文:伯乐在线专栏作者 - 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 (







请到「今天看啥」查看全文