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

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

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

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

    能做出来就厉害了。极大简化 controller 里的面条粗细程度。
    prasanta
    prasanta
    OP
    Mar 10, 2017
    21
    @est 好主意, 我决定加入这样的功能,请关注我的 README
    neoblackcap
    neoblackcap
    Mar 10, 2017
    22
    @prasanta 看你的代码不像啊,你写的都是 ActiveRecord 吧, ActiveRecord 是将操作跟数据库领域模型绑定在一起,比如 User 类有 insert 之类的操作,这样就是 ActiveRecord 。
    至于 DataMapper 是只能通过一个 proxy 来进行数据库操作,举例子就是 SQLAlchemy 中的 session 对象, SQLAlchemy 里面的 Model 是没有操作数据库的能力
    prasanta
    prasanta
    OP
    Mar 10, 2017
    23
    @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
    solee
    Mar 10, 2017
    24
    我看了标题就在想 这不是 golang 的 orm 么~~ 最喜欢的 orm [sequelize]
    TheCure
    TheCure
    Mar 10, 2017
    25
    为啥我用 golang 的 xorm 数据库 datetime 是 null 的话 返回的字符串是 0001-01-01 07:06:20
    prasanta
    prasanta
    OP
    Mar 10, 2017
    26
    @callofmx 这不是 golang 那个
    yeyuexia
    yeyuexia
    Mar 10, 2017
    27
    很久前写的 mongo 的 ORM 后来换工作什么的就再没维护了 orz 不知道楼主觉得我这样的 api 设计的如何 https://github.com/yeyuexia/mongotoy
    prasanta
    prasanta
    OP
    Mar 10, 2017
    28
    @yeyuexia 挺好的啊, 怎么不维护下去呢
    neoblackcap
    neoblackcap
    Mar 10, 2017
    29
    @prasanta 差不多, ActiveRecord 都差不多是这个思路。没问题,不过你返回的是字典对象的话,那么不就代表我想扩展一下 Model 子类都不行了吗?那样很残废啊。

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

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

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