PonyORM - python的新一代黑魔法级别ORM

2013-05-09 00:16:04 +08:00
 chuangbo
原文在 tumblr,大家自备梯子
http://blog.est.im/post/49564925054

由于被墙,我简单摘要一下博客内容

最亮的地方是他的语法
select(c for c in Customer
  if sum(c.orders.price) > 1000)

然后实现原理
1. 首先select(x for x in ...) 这是一个generator comprehension,和list comprehension不同的是,返回的是一个惰性求值的生成器,于是
2. 该表达式bytecode可以反编译
3. 把Python的AST翻译成SQL的AST
4. 分离和优化查询。
5. 把SQL AST生成为特定数据库的query
6. 执行SQL query
7. 把返回构造成python对象,并且缓存。

很神器吧?比 Django ORM 和 SQLAlchemy 都方便很多,还有一个在线图形化的 Declare 生成器。。
5889 次点击
所在节点    Python
17 条回复
onetown
2013-05-09 00:23:34 +08:00
试了一下, 简单好用。
yetone
2013-05-09 07:31:56 +08:00
标记一下
liuxurong
2013-05-09 07:52:23 +08:00
效率咋样,马克。
jjx
2013-05-09 09:06:34 +08:00
这种语法看似简单,其实并不直观, 以前用linq 有感

比方说,为什么是left outer join而不是inner join,为什么用having而不是where ,这些都不是一眼能看出来的
davepkxxx
2013-05-09 09:34:59 +08:00
python在语言级别支持linq?什么时候的事情?
est
2013-05-09 09:37:01 +08:00
@jjx 呃,列表解析的语法就是python的语法。。。比如 [c for c in Customer] ,其中Customer就可以是一个list。

个人感觉python的列表解析还是非常接近日然语言的,而Linq差不多就是翻版SQL,不好理解。

比如顶楼那个例子:

python:

select(c for c in Customer
if sum(c.orders.price) > 1000)

SQL:


SELECT "c"."id"
FROM "Customer" "c"
LEFT JOIN "Order" "order-1"
ON "c"."id" = "order-1"."customer"
GROUP BY "c"."id"
HAVING coalesce(SUM("order-1"."total_price"), 0) > 1000

Linq的话基本就是把from写在前边了吧?
bitsmix
2013-05-09 10:09:34 +08:00
给个官网link会死么会死么会死么

http://ponyorm.com/
TONYHEAD
2013-05-09 15:53:29 +08:00
神器?楼主打万智牌的吗?
saggit
2013-05-10 09:42:13 +08:00
为了回复你,我这个酱油党,也注册个,这个公司用或者商业用 要收费的,价格也不便宜,
greatghoul
2013-05-10 10:23:38 +08:00
我刚看到标题,以为是 PornORM 感觉口味很重,赶紧就进来了,结果发现自己邪恶的看错了。
chuangbo
2013-05-10 11:35:58 +08:00
@greatghoul 很有趣的想法 :D
在延伸一下,你觉得一个叫做 Porn 的 ORM 会有哪些 Feature 呢?
greatghoul
2013-05-10 12:54:00 +08:00
@chuangbo

- 连接数据库的接口要多 -> 想象一下口,菊花等
- 语句写法也灵活 -> 想象下各种姿势
- 支持上亿并发吞吐 -> 想象下那么多的子孙
- 支持在沙盒中运行,不影响数据库,方便调试 -> 带上TT就安全啦
Golevka
2013-05-10 13:54:09 +08:00
@davepkxxx 说好的手工解析thunk的AST呢
ivenvd
2013-05-11 01:16:45 +08:00
这样性能可能更好,方便看不出来……很怀疑能够有 SQLAlchemy 功能那么强么……文档里各种 TBD 这敢用?
chuangbo
2013-05-11 01:18:43 +08:00
@ivenvd 哈哈,确实,昨天试用了一下就被坑到了,然后文档全是 TBD,无解。。
levon
2013-05-11 22:32:17 +08:00
if来表示where,非常不顺眼
grzhan
2016-11-18 05:30:01 +08:00
自定义 Python3 Enum 的 Converter 时候碰到坑了,无法很好地整合到列表解析中去。

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

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

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

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

© 2021 V2EX