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

2017-03-09 23:43:11 +08:00
 prasanta

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

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

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

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

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

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

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

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

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

© 2021 V2EX