SQLAlchemy 比 Django 自带的 ORM 好在哪里?

2017-02-08 04:33:02 +08:00
 eyp82

最近看了一下 SQLAlchemy 的文档, 感觉大致的使用方式跟 Django ORM 很像(包括 Peewee 之类都很像), 就是细节上感觉有点拧巴, 不如 Django 的 ORM 那么自然. 那 SQLAlchemy 相比有哪些优势呢? 谢谢大家.

16618 次点击
所在节点    Python
54 条回复
changwei
2017-02-08 06:29:20 +08:00
我用过 php 下各种框架得 orm 之后觉得 python 下的 orm 都很拧巴。。。
bigzhu
2017-02-08 08:19:17 +08:00
早年没靠谱 orm 的时候(暴露年龄了),点了太多技能点在写 sql 上,之后觉得所有的 orm 都很拧巴。。。
chaleaoch
2017-02-08 08:40:11 +08:00
说几个 django orm 坑爹的地方。
1. 有些 group by 无法用 orm 实现。
2. 有些连表查询,用 djanog orm 写出来的 sql 是子查询。
3. 速度感人,一个两万条记录的查询,用时三秒。 sql<100ms

1 和 2sqlalchemy 有很好的解决方案。
3 我不确定 sqlalchemy 是更快还是更慢。
chaleaoch
2017-02-08 08:41:31 +08:00
还有 django orm 如法实现分表。至少原生不支持。只能分区。
sqlalchemy 支持。
eyp82
2017-02-08 08:42:53 +08:00
@chaleaoch 感谢具体的体验和回复
XhstormR
2017-02-08 08:47:07 +08:00
@chaleaoch 所以推荐原生 SQL ,还是 ORM 呢?
chaleaoch
2017-02-08 08:54:45 +08:00
@XhstormR 该用 orm 还是得用 orm 毕竟方便。一直都用 sql 有两个问题,一个是预防 sql 注入,另一个是代码不易读。
precisi0nux
2017-02-08 09:25:35 +08:00
@changwei 毕竟是世界上最好的语言。
est
2017-02-08 09:27:14 +08:00
sqlalchemy 怎么评价呢,首先说,功能完善整齐

然后就是 1 楼所说的,拧巴!没错!有的时候真行想自己去撸 sql 。。 orm 是一种思维和开发的负担。难写难维护难调试


sqlalchemy 的问题,用一句话表示:

from sqlalchemy.orm import joinedload, Load, load_only

你看,这里面包含了不含下划线全小写风格,驼峰风格,下划线风格三种 style 。真是玩死你系列。
TangMonk
2017-02-08 09:30:42 +08:00
ActiveRecord 路过。。
vicalloy
2017-02-08 09:52:17 +08:00
没用过 SQLAlchemy ,不是很了解。
很早之前简单的了解过 SQLAlchemy ,从 API 的友好度上看 Django 的 ORM 比 SQLAlchemy 好很多(个人看法)。
Django 的 ORM 调优其实并不是很难,很多时候慢是因为用的不对(糟糕的 SQL 一样慢)。
当然,在极少数情况下还是会出现 ORM 无能为力的情况,这时候可以直接写 SQL 。 ORM 和 SQL 并不冲突。为了这 0.x%的情况而放弃使用 ORM 很没必要。
@chaleaoch
1. Django 的查询可以嵌入 SQL ,也可以把自己手写的 SQL 绑定到对象上。
不知道你遇到的具体情况是怎么样的,不过在我看来第一条应当是可以实现。
2. 有些表连接写出来是子查询,这个需要结合具体案例,不是很确定是否是写法问题。
3. 2w 条数据查询用时 3 秒,这个非常不正常,需要结合具体代码进行分析。从我主观角度看是代码写的有问题。
zhouquanbest
2017-02-08 10:04:40 +08:00
以前只用 SQLAlchemy 现在用 Peewee 感觉 API 更友好
xiaket
2017-02-08 10:16:32 +08:00
我和你的感觉是一样的, Django 的 ORM 的易读性比 peewee 好一圈, peewee 的易读性比 SA 好两圈或更多...
est
2017-02-08 12:17:57 +08:00
@zhouquanbest peewee 坑多。主要与原因是 too young

@xiaket 赞同。

django 的 orm 其实挺好的。应付 90% 的逻辑没问题,读起来改起来都比 sql 容易太多。
anjianshi
2017-02-08 12:23:50 +08:00
sqlalchemy 硬着头皮用了一段时间,实在研究不下去,改用 peewee 了。
用 peewee ,哪里碰到了问题直接去查源码,主体就一个 python 文件,感觉代码思路很清晰,碰到的大部分问题都得以解决了。
用 sqlalchemy 的时候想查源码都查不出个头绪来
xiaket
2017-02-08 12:30:10 +08:00
@est 个人曾经想过把 Django 的 ORM 完全剥离出来,这样就可以脱离 Django 使用,后来看到 peewee 就放弃了... 不是说它做得有多好,不过至少是存在了.
loading
2017-02-08 12:37:02 +08:00
sqlalchemy 很多语言都有实现,换语言,换库都能直接上手。
sagaxu
2017-02-08 13:04:56 +08:00
@est 那是 PEP8 规定的命名方式
chaleaoch
2017-02-08 13:15:09 +08:00
@vicalloy
@chaleaoch
1. Django 的查询可以嵌入 SQL ,也可以把自己手写的 SQL 绑定到对象上。
不知道你遇到的具体情况是怎么样的,不过在我看来第一条应当是可以实现。
====
django orm 是有 extra 的写法,不过我把这种写法归于直接 sql 一类。(也是我个人观点)
2. 有些表连接写出来是子查询,这个需要结合具体案例,不是很确定是否是写法问题。
3. 2w 条数据查询用时 3 秒,这个非常不正常,需要结合具体代码进行分析。从我主观角度看是代码写的有问题。
====
非常简单 <model>.objects.all().values() 三秒
<model>.objects.filter(<这里假设出 10000 条数据>).values() 一秒
直接用客户端查询 select * from <table name> <100ms

我的理解问题出在 django orm 在生成映射结构的时候多处使用 for 循环导致的这个问题。
xiaket
2017-02-08 13:35:46 +08:00
@chaleaoch 不给 ORM 翻译出来的 SQL 就和裸 SQL 比较性能并猜测原因略有些耍流氓...

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/338916

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX