ORM for the zen of python.
相信大家能通过下面的代码明白我的意思.
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()
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
我还没有开始写,大家帮忙提提意见
方案一直在优化 方案当前情况请查看README: https://github.com/gaojiuli/xorm
1
thomaspaine 2017-03-09 23:47:12 +08:00
用法感觉和 sqlalchemy 差不多啊
|
2
prasanta OP @thomaspaine orm 思想都是差不多的, 我的目标是将 api 缩减为常用的几个, 数据表的建立和数据库的迁移傻瓜化, 查询语句直接生成字典, 而不用自己 serializer
|
3
jarlyyn 2017-03-10 00:52:19 +08:00
golang 有个 orm 也叫这儿
|
4
neoblackcap 2017-03-10 01:01:52 +08:00 1
讲道理的话,我觉得 ORM 接口做得做好的就是类似 linq 那种,也就是像 PonyORM 或者 macropy 那种。不过他们好像都是 ActiveRecord , SQLAlchemy 是 DataMapper 来的,因此有些人会觉得 SQLAlchemy 比起其他 ORM 难用,关键就是在这里。
|
5
zonghua 2017-03-10 01:10:32 +08:00 via iPhone
Django orm
|
6
mayne95 2017-03-10 03:17:19 +08:00 via Android
所以这个是给 xweb 用的😂
|
7
binux 2017-03-10 05:43:14 +08:00
你这一点都不 zen of python
|
8
verydxz 2017-03-10 06:14:28 +08:00
@neoblackcap +1
|
10
prasanta OP @neoblackcap 我比较喜欢 datamapper
|
12
prasanta OP @xiaket peewee 冗余功能挺多,我主要是针对 restful 接口设计这个 orm
|
15
johnny23 2017-03-10 08:02:32 +08:00 via iPhone 1
linq2sql
|
16
Gem 2017-03-10 08:27:44 +08:00 1
ActiveRecord !
|
17
zhustec 2017-03-10 09:09:41 +08:00 via Android
ActiveRecord +1
|
18
Lycnir 2017-03-10 09:14:22 +08:00
如果能支持 2.7 的异步,我就用它
|
20
est 2017-03-10 10:34:29 +08:00
我现在急需一个混合 backend 的 ORM
比如一个 User 对象, name 是保存在 mysql 里的, login_cnt 登陆次数,保存在 redis 。 惰性求值,结果缓存,能交叉查询等等。 能做出来就厉害了。极大简化 controller 里的面条粗细程度。 |
22
neoblackcap 2017-03-10 12:10:17 +08:00
@prasanta 看你的代码不像啊,你写的都是 ActiveRecord 吧, ActiveRecord 是将操作跟数据库领域模型绑定在一起,比如 User 类有 insert 之类的操作,这样就是 ActiveRecord 。
至于 DataMapper 是只能通过一个 proxy 来进行数据库操作,举例子就是 SQLAlchemy 中的 session 对象, SQLAlchemy 里面的 Model 是没有操作数据库的能力 |
23
prasanta OP @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. 返回的数据为字典对象 你看看有什么建议 |
24
solee 2017-03-10 13:29:59 +08:00
我看了标题就在想 这不是 golang 的 orm 么~~ 最喜欢的 orm [sequelize]
|
25
TheCure 2017-03-10 13:36:16 +08:00
为啥我用 golang 的 xorm 数据库 datetime 是 null 的话 返回的字符串是 0001-01-01 07:06:20
|
27
yeyuexia 2017-03-10 15:38:23 +08:00
很久前写的 mongo 的 ORM 后来换工作什么的就再没维护了 orz 不知道楼主觉得我这样的 api 设计的如何 https://github.com/yeyuexia/mongotoy
|
29
neoblackcap 2017-03-10 15:55:55 +08:00
@prasanta 差不多, ActiveRecord 都差不多是这个思路。没问题,不过你返回的是字典对象的话,那么不就代表我想扩展一下 Model 子类都不行了吗?那样很残废啊。
我第一个回复上面举的例子是不错的参考,结合 Python 的自身生成器,迭代器,列表推导。不过 API 这回事大多数品味而已。我比较关注是你如何处理比较复杂的 join 操作,毕竟很多 ActiveRecord 的 API 不太好处理各类 join 的操作。这是我在使用时的体会。 虽然说很多人说 join 不好,但是平常大家体量没上去的时候肯定整天会用各类 join ,希望能考虑一下 |
30
yeyuexia 2017-03-10 16:13:24 +08:00
@prasanta 因为换工作了之后比较忙(技术栈转成了 java 得从头学) 后来发现 pymongo 都到 3.x 了 然后在搞其他的东西就搁置了
|
31
prasanta OP @neoblackcap 谢谢你的建议, 我会好好考虑你的意见, 有进展会通知你
|
32
lightening 2017-03-10 16:52:21 +08:00
你指 ORM 本身的代码尽量少,还是用 ORM 的人可以尽量少写代码呢?
要不学学 Ruby 的 ActiveRecord ,从数据库自己获取 Schema 吧。 |
33
prasanta OP @lightening 用的人少写代码, 本身代码也少
|
34
fwee 2017-03-10 18:40:32 +08:00
看 LZ 是有真想做些事情的热情,那建议用心研究下 Ruby 的 ActiveRecord ,如果能在 python 推出个稳定可靠的版本绝对是造福众人
|
35
lightening 2017-03-10 19:09:18 +08:00
@prasanta 这两者基本是互相矛盾的
|
37
prasanta OP @lightening 尽量吧
|
38
fy 2017-03-10 23:45:02 +08:00
import peewee as xorm
|
39
ericls 2017-03-11 00:09:14 +08:00
我心目中的 ORM 不是 ORM 是 DSL
|
41
qile1 2017-03-11 21:00:35 +08:00 via Android
支持 mssql 就可以了
|
42
xiaket 2017-03-14 06:09:35 +08:00
@prasanta 有的: http://docs.peewee-orm.com/en/latest/peewee/playhouse.html#migrate
另,“针对 restful 接口设计这个 orm ”, 这句真没看懂 |