Python中xorm立项,你心目中极简风格的ORM系统应该是什么样的?

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

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


Python中xorm立项,你心目中极简风格的ORM系统应该是什么样的?

44 回复

用法感觉和 sqlalchemy 差不多啊


我心目中极简风格的ORM,核心就两点:声明即模型,查询即语句

别整那些复杂的元类、层层继承的QuerySet或者要记半天的链式方法。理想状态是,用Python最自然的语法就能搞定大部分事。

1. 模型声明要干净 直接用类属性定义字段,类型标注就是schema,跟Pydantic或SQLModel思路类似。多余的一句都别写。

class User:
    id: int = Field(primary_key=True)
    name: str
    email: str = Field(unique=True)
    created_at: datetime = Field(default_factory=datetime.now)

2. 查询要像写SQL一样直观 别让我学一套新的查询语言。直接用Python表达式或者类SQL的字符串,简单明了。

# 理想方式1:用Python表达式(类似Django的F表达式但更简洁)
users = session.query(User).where(User.age > 25, User.name.like('A%'))

# 理想方式2:直接写SQL WHERE子句(对复杂查询更友好)
users = session.query(User).where("age > ? AND name LIKE ?", 25, 'A%')

3. 会话管理要无感 最好能上下文自动管理,不用老惦记着commit()close()

with db.transaction():
    user = User(name="John", email="john@example.com")
    db.add(user)
    # 自动提交,出错自动回滚

4. 关系处理要轻量 外键和关联查询要有,但配置应该一步到位,别搞一堆relationship的复杂参数。

class Post:
    id: int
    title: str
    author_id: int = Field(foreign_key=User.id)
    # 需要时再join,不默认加载

5. 迁移非核心 数据库迁移应该是独立工具(像Alembic),不是ORM核心部分。ORM只管映射和查询。

极简的本质是:用20%的功能解决80%的需求,剩下的复杂场景允许你直接写SQL。像Peewee和Pony ORM在这条路上走得不错,但还可以更激进——比如完全放弃session.query(User).filter_by(...)这种模式,直接支持User.select().where(...)甚至db.select(User).where(...)

总结:极简ORM就是写起来像直接操作字典和列表,但背后连着数据库。

orm 思想都是差不多的, 我的目标是将 api 缩减为常用的几个, 数据表的建立和数据库的迁移傻瓜化, 查询语句直接生成字典, 而不用自己 serializer

golang 有个 orm 也叫这儿

讲道理的话,我觉得 ORM 接口做得做好的就是类似 linq 那种,也就是像 PonyORM 或者 macropy 那种。不过他们好像都是 ActiveRecord , SQLAlchemy 是 DataMapper 来的,因此有些人会觉得 SQLAlchemy 比起其他 ORM 难用,关键就是在这里。

Django orm

所以这个是给 xweb 用的😂

你这一点都不 zen of python

极简风格,极少代码, 那么已经有 peewee 了.

另同意 , 的确不 zen of python

我比较喜欢 datamapper

可以给点意见么

peewee 冗余功能挺多,我主要是针对 restful 接口设计这个 orm

虽然是这意思,但是没有耦合!

这个没关系,改名字还是挺容易的

linq2sql

ActiveRecord !

ActiveRecord +1

如果能支持 2.7 的异步,我就用它

可以详细说一下么

我现在急需一个混合 backend 的 ORM

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

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

能做出来就厉害了。极大简化 controller 里的面条粗细程度。

好主意, 我决定加入这样的功能,请关注我的 README

看你的代码不像啊,你写的都是 ActiveRecord 吧, ActiveRecord 是将操作跟数据库领域模型绑定在一起,比如 User 类有 insert 之类的操作,这样就是 ActiveRecord 。
至于 DataMapper 是只能通过一个 proxy 来进行数据库操作,举例子就是 SQLAlchemy 中的 session 对象, SQLAlchemy 里面的 Model 是没有操作数据库的能力

感谢你的回复, 可能是我搞混了 ActiveRecord 和 DataMapper. 我说一下我的思路,:

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

你看看有什么建议

我看了标题就在想 这不是 golang 的 orm 么~~ 最喜欢的 orm [sequelize]

为啥我用 golang 的 xorm 数据库 datetime 是 null 的话 返回的字符串是 0001-01-01 07:06:20

这不是 golang 那个

很久前写的 mongo 的 ORM 后来换工作什么的就再没维护了 orz 不知道楼主觉得我这样的 api 设计的如何 https://github.com/yeyuexia/mongotoy

挺好的啊, 怎么不维护下去呢

差不多, ActiveRecord 都差不多是这个思路。没问题,不过你返回的是字典对象的话,那么不就代表我想扩展一下 Model 子类都不行了吗?那样很残废啊。

我第一个回复上面举的例子是不错的参考,结合 Python 的自身生成器,迭代器,列表推导。不过 API 这回事大多数品味而已。我比较关注是你如何处理比较复杂的 join 操作,毕竟很多 ActiveRecord 的 API 不太好处理各类 join 的操作。这是我在使用时的体会。
虽然说很多人说 join 不好,但是平常大家体量没上去的时候肯定整天会用各类 join ,希望能考虑一下

因为换工作了之后比较忙(技术栈转成了 java 得从头学) 后来发现 pymongo 都到 3.x 了 然后在搞其他的东西就搁置了

谢谢你的建议, 我会好好考虑你的意见, 有进展会通知你

你指 ORM 本身的代码尽量少,还是用 ORM 的人可以尽量少写代码呢?

要不学学 Ruby 的 ActiveRecord ,从数据库自己获取 Schema 吧。

用的人少写代码, 本身代码也少

看 LZ 是有真想做些事情的热情,那建议用心研究下 Ruby 的 ActiveRecord ,如果能在 python 推出个稳定可靠的版本绝对是造福众人

这两者基本是互相矛盾的

我会大量参考 rails orm 以及 django orm

尽量吧

import peewee as xorm

我心目中的 ORM 不是 ORM 是 DSL

很完美, 要是有 migration 功能就好了

支持 mssql 就可以了

有的: http://docs.peewee-orm.com/en/latest/peewee/playhouse.html#migrate

另,“针对 restful 接口设计这个 orm ”, 这句真没看懂

orm 的动作直接和 http 请求映射起来

回到顶部