推荐学习书目
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
prasanta
V2EX  ›  Python

xorm 立项,你心目中 ORM 系统是什么样的(极简风格,极少代码)

  •  
  •   prasanta · Mar 9, 2017 · 6826 views
    This topic created in 3382 days ago, the information mentioned may be changed or developed.

    xorm

    xorm

    ORM for the zen of python.

    相信大家能通过下面的代码明白我的意思.

    model

    from xorm import Model
    from xorm.fields import *
    
    class User(Model):
      name = Char()
      age = Int()
      is_adult = Bool()
      groups = ManyToMany(Group,related_name="users")
    
    class Group(Model):
      name = Char()
      created_at = DateTime()
    

    migrate

    1. xorm makemigrations
    2. xorm migrate
    3. xorm rollback

    query

    from .models import User
    from xorm import sql
    
    User.list(age_lt = 18, groups__name = "doit").fields(['name', 'age', {'groups': ['name']}])
    
    User.retrive(id=1).fields(['name', 'age'])
    
    User.replace(id=1).data({'name':'test1'})
    
    User.update(id=1).data({'age': 18})
    
    User.create(data={})
    
    User.delete(id=1)a
    
    xorm.sql('SELECT * FROM users')
    
    

    github 项目地址:https://github.com/gaojiuli/xorm

    我还没有开始写,大家帮忙提提意见

    Supplement 1  ·  Mar 10, 2017

    方案一直在优化 方案当前情况请查看README: https://github.com/gaojiuli/xorm

    43 replies    2017-03-14 09:07:29 +08:00
    thomaspaine
        1
    thomaspaine  
       Mar 9, 2017
    用法感觉和 sqlalchemy 差不多啊
    prasanta
        2
    prasanta  
    OP
       Mar 9, 2017
    @thomaspaine orm 思想都是差不多的, 我的目标是将 api 缩减为常用的几个, 数据表的建立和数据库的迁移傻瓜化, 查询语句直接生成字典, 而不用自己 serializer
    jarlyyn
        3
    jarlyyn  
       Mar 10, 2017
    golang 有个 orm 也叫这儿
    neoblackcap
        4
    neoblackcap  
       Mar 10, 2017   ❤️ 1
    讲道理的话,我觉得 ORM 接口做得做好的就是类似 linq 那种,也就是像 PonyORM 或者 macropy 那种。不过他们好像都是 ActiveRecord , SQLAlchemy 是 DataMapper 来的,因此有些人会觉得 SQLAlchemy 比起其他 ORM 难用,关键就是在这里。
    zonghua
        5
    zonghua  
       Mar 10, 2017 via iPhone
    Django orm
    mayne95
        6
    mayne95  
       Mar 10, 2017 via Android
    所以这个是给 xweb 用的😂
    binux
        7
    binux  
       Mar 10, 2017
    你这一点都不 zen of python
    verydxz
        8
    verydxz  
       Mar 10, 2017
    xiaket
        9
    xiaket  
       Mar 10, 2017
    极简风格,极少代码, 那么已经有 peewee 了.

    另同意 @binux, 的确不 zen of python
    prasanta
        10
    prasanta  
    OP
       Mar 10, 2017 via Android
    @neoblackcap 我比较喜欢 datamapper
    prasanta
        11
    prasanta  
    OP
       Mar 10, 2017 via Android
    @binux 可以给点意见么
    prasanta
        12
    prasanta  
    OP
       Mar 10, 2017 via Android
    @xiaket peewee 冗余功能挺多,我主要是针对 restful 接口设计这个 orm
    prasanta
        13
    prasanta  
    OP
       Mar 10, 2017 via Android
    @mayne95 虽然是这意思,但是没有耦合!
    prasanta
        14
    prasanta  
    OP
       Mar 10, 2017 via Android
    @jarlyyn 这个没关系,改名字还是挺容易的
    johnny23
        15
    johnny23  
       Mar 10, 2017 via iPhone   ❤️ 1
    linq2sql
    Gem
        16
    Gem  
       Mar 10, 2017   ❤️ 1
    ActiveRecord !
    zhustec
        17
    zhustec  
       Mar 10, 2017 via Android
    ActiveRecord +1
    Lycnir
        18
    Lycnir  
       Mar 10, 2017
    如果能支持 2.7 的异步,我就用它
    prasanta
        19
    prasanta  
    OP
       Mar 10, 2017
    @Lycnir 可以详细说一下么
    est
        20
    est  
       Mar 10, 2017
    我现在急需一个混合 backend 的 ORM

    比如一个 User 对象, name 是保存在 mysql 里的, login_cnt 登陆次数,保存在 redis 。

    惰性求值,结果缓存,能交叉查询等等。

    能做出来就厉害了。极大简化 controller 里的面条粗细程度。
    prasanta
        21
    prasanta  
    OP
       Mar 10, 2017
    @est 好主意, 我决定加入这样的功能,请关注我的 README
    neoblackcap
        22
    neoblackcap  
       Mar 10, 2017
    @prasanta 看你的代码不像啊,你写的都是 ActiveRecord 吧, ActiveRecord 是将操作跟数据库领域模型绑定在一起,比如 User 类有 insert 之类的操作,这样就是 ActiveRecord 。
    至于 DataMapper 是只能通过一个 proxy 来进行数据库操作,举例子就是 SQLAlchemy 中的 session 对象, SQLAlchemy 里面的 Model 是没有操作数据库的能力
    prasanta
        23
    prasanta  
    OP
       Mar 10, 2017
    @neoblackcap 感谢你的回复, 可能是我搞混了 ActiveRecord 和 DataMapper. 我说一下我的思路,:

    1. 模仿 Django ORM 定义 Model, 以及实现它的 makemigrations 功能, 方便迁移.
    2. 将 Model 的方法定义在有限的几个操作中 list,retrieve,create,destroy,replace,update.这几个方法生成对应的 Query, Query 生成对应的 sql, Model 同时可以自定义自己方法, 实现类似 def change_status()这样的方法,方法里进行逻辑处理, 而不把逻辑放到 controller 中.
    3. 返回的数据为字典对象

    你看看有什么建议
    solee
        24
    solee  
       Mar 10, 2017
    我看了标题就在想 这不是 golang 的 orm 么~~ 最喜欢的 orm [sequelize]
    TheCure
        25
    TheCure  
       Mar 10, 2017
    为啥我用 golang 的 xorm 数据库 datetime 是 null 的话 返回的字符串是 0001-01-01 07:06:20
    prasanta
        26
    prasanta  
    OP
       Mar 10, 2017
    @callofmx 这不是 golang 那个
    yeyuexia
        27
    yeyuexia  
       Mar 10, 2017
    很久前写的 mongo 的 ORM 后来换工作什么的就再没维护了 orz 不知道楼主觉得我这样的 api 设计的如何 https://github.com/yeyuexia/mongotoy
    prasanta
        28
    prasanta  
    OP
       Mar 10, 2017
    @yeyuexia 挺好的啊, 怎么不维护下去呢
    neoblackcap
        29
    neoblackcap  
       Mar 10, 2017
    @prasanta 差不多, ActiveRecord 都差不多是这个思路。没问题,不过你返回的是字典对象的话,那么不就代表我想扩展一下 Model 子类都不行了吗?那样很残废啊。

    我第一个回复上面举的例子是不错的参考,结合 Python 的自身生成器,迭代器,列表推导。不过 API 这回事大多数品味而已。我比较关注是你如何处理比较复杂的 join 操作,毕竟很多 ActiveRecord 的 API 不太好处理各类 join 的操作。这是我在使用时的体会。
    虽然说很多人说 join 不好,但是平常大家体量没上去的时候肯定整天会用各类 join ,希望能考虑一下
    yeyuexia
        30
    yeyuexia  
       Mar 10, 2017
    @prasanta 因为换工作了之后比较忙(技术栈转成了 java 得从头学) 后来发现 pymongo 都到 3.x 了 然后在搞其他的东西就搁置了
    prasanta
        31
    prasanta  
    OP
       Mar 10, 2017
    @neoblackcap 谢谢你的建议, 我会好好考虑你的意见, 有进展会通知你
    lightening
        32
    lightening  
       Mar 10, 2017
    你指 ORM 本身的代码尽量少,还是用 ORM 的人可以尽量少写代码呢?

    要不学学 Ruby 的 ActiveRecord ,从数据库自己获取 Schema 吧。
    prasanta
        33
    prasanta  
    OP
       Mar 10, 2017
    @lightening 用的人少写代码, 本身代码也少
    fwee
        34
    fwee  
       Mar 10, 2017
    看 LZ 是有真想做些事情的热情,那建议用心研究下 Ruby 的 ActiveRecord ,如果能在 python 推出个稳定可靠的版本绝对是造福众人
    lightening
        35
    lightening  
       Mar 10, 2017
    @prasanta 这两者基本是互相矛盾的
    prasanta
        36
    prasanta  
    OP
       Mar 10, 2017
    @fwee 我会大量参考 rails orm 以及 django orm
    prasanta
        37
    prasanta  
    OP
       Mar 10, 2017
    @lightening 尽量吧
    fy
        38
    fy  
       Mar 10, 2017
    import peewee as xorm
    ericls
        39
    ericls  
       Mar 11, 2017
    我心目中的 ORM 不是 ORM 是 DSL
    prasanta
        40
    prasanta  
    OP
       Mar 11, 2017
    @fy 很完美, 要是有 migration 功能就好了
    qile1
        41
    qile1  
       Mar 11, 2017 via Android
    支持 mssql 就可以了
    xiaket
        42
    xiaket  
       Mar 14, 2017
    @prasanta 有的: http://docs.peewee-orm.com/en/latest/peewee/playhouse.html#migrate

    另,“针对 restful 接口设计这个 orm ”, 这句真没看懂
    prasanta
        43
    prasanta  
    OP
       Mar 14, 2017
    @xiaket orm 的动作直接和 http 请求映射起来
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Solana   ·   2898 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 77ms · UTC 10:09 · PVG 18:09 · LAX 03:09 · JFK 06:09
    ♥ Do have faith in what you're doing.