Python中xorm立项,你心目中极简风格的ORM系统应该是什么样的?
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
- xorm makemigrations
- xorm migrate
- 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系统应该是什么样的?
用法感觉和 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
+1
我比较喜欢 datamapper
可以给点意见么
虽然是这意思,但是没有耦合!
这个没关系,改名字还是挺容易的
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 请求映射起来


