V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐学习书目
Learn Python the Hard Way
Python Sites
PyPI - Python Package Index
http://diveintopython.org/toc/index.html
Pocoo
值得关注的项目
PyPy
Celery
Jinja2
Read the Docs
gevent
pyenv
virtualenv
Stackless Python
Beautiful Soup
结巴中文分词
Green Unicorn
Sentry
Shovel
Pyflakes
pytest
Python 编程
pep8 Checker
Styles
PEP 8
Google Python Style Guide
Code Style from The Hitchhiker's Guide
chuangbo
V2EX  ›  Python

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

  •  
  •   chuangbo · 2013-05-09 00:16:04 +08:00 · 6025 次点击
    这是一个创建于 4220 天前的主题,其中的信息可能已经有所发展或是发生改变。
    原文在 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 生成器。。
    17 条回复    2016-11-18 05:30:01 +08:00
    onetown
        1
    onetown  
       2013-05-09 00:23:34 +08:00
    试了一下, 简单好用。
    yetone
        2
    yetone  
       2013-05-09 07:31:56 +08:00 via Android
    标记一下
    liuxurong
        3
    liuxurong  
       2013-05-09 07:52:23 +08:00
    效率咋样,马克。
    jjx
        4
    jjx  
       2013-05-09 09:06:34 +08:00
    这种语法看似简单,其实并不直观, 以前用linq 有感

    比方说,为什么是left outer join而不是inner join,为什么用having而不是where ,这些都不是一眼能看出来的
    davepkxxx
        5
    davepkxxx  
       2013-05-09 09:34:59 +08:00
    python在语言级别支持linq?什么时候的事情?
    est
        6
    est  
       2013-05-09 09:37:01 +08:00   ❤️ 1
    @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
        7
    bitsmix  
       2013-05-09 10:09:34 +08:00   ❤️ 1
    给个官网link会死么会死么会死么

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

    - 连接数据库的接口要多 -> 想象一下口,菊花等
    - 语句写法也灵活 -> 想象下各种姿势
    - 支持上亿并发吞吐 -> 想象下那么多的子孙
    - 支持在沙盒中运行,不影响数据库,方便调试 -> 带上TT就安全啦
    Golevka
        13
    Golevka  
       2013-05-10 13:54:09 +08:00
    @davepkxxx 说好的手工解析thunk的AST呢
    ivenvd
        14
    ivenvd  
       2013-05-11 01:16:45 +08:00
    这样性能可能更好,方便看不出来……很怀疑能够有 SQLAlchemy 功能那么强么……文档里各种 TBD 这敢用?
    chuangbo
        15
    chuangbo  
    OP
       2013-05-11 01:18:43 +08:00
    @ivenvd 哈哈,确实,昨天试用了一下就被坑到了,然后文档全是 TBD,无解。。
    levon
        16
    levon  
       2013-05-11 22:32:17 +08:00
    if来表示where,非常不顺眼
    grzhan
        17
    grzhan  
       2016-11-18 05:30:01 +08:00   ❤️ 1
    自定义 Python3 Enum 的 Converter 时候碰到坑了,无法很好地整合到列表解析中去。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   3935 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 22ms · UTC 10:23 · PVG 18:23 · LAX 02:23 · JFK 05:23
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.