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
prasanta
V2EX  ›  Python

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

  •  
  •   prasanta ·
    gaojiuli · 2017-03-09 23:43:11 +08:00 · 5414 次点击
    这是一个创建于 1898 天前的主题,其中的信息可能已经有所发展或是发生改变。

    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

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

    第 1 条附言  ·  2017-03-10 11:14:32 +08:00

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

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

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

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

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

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

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

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

    另,“针对 restful 接口设计这个 orm ”, 这句真没看懂
    prasanta
        43
    prasanta  
    OP
       2017-03-14 09:07:29 +08:00
    @xiaket orm 的动作直接和 http 请求映射起来
    关于   ·   帮助文档   ·   API   ·   FAQ   ·   我们的愿景   ·   广告投放   ·   感谢   ·   实用小工具   ·   2586 人在线   最高记录 5497   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 25ms · UTC 02:59 · PVG 10:59 · LAX 19:59 · JFK 22:59
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.