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

fastapi 中有没有好用的 orm 工具推荐,以及 orm 是方便迁移的,可以实现像 django 的 migrate 的功能

  •  
  •   lzyong2019 · 12 天前 · 1719 次点击

    有类似推荐的项目也可。

    18 条回复    2025-01-10 11:41:00 +08:00
    encro
        1
    encro  
       12 天前
    encro
        2
    encro  
       12 天前
    不仅支持 async ,
    且支持如同 django 一样的模块化,
    支持模块化迁移,
    支持模块命令,
    代码提示友好。
    chaselen
        3
    chaselen  
       12 天前
    @encro 这名字。。龙珠粉?
    lyhapple
        4
    lyhapple  
       12 天前
    目前我用的方案是 fastapi+sqlalchemy+alembic ,习惯了之后感觉还不错。
    wryyyyyyyyyyyy
        5
    wryyyyyyyyyyyy  
       12 天前
    sqlalchemy
    sqlmodel ,这个是 fastapi 开发者对 sqlalchemy + pydantic 的封装,部分情况使用起来更方便一点。
    lzyong2019
        6
    lzyong2019  
    OP
       12 天前
    alembic 它貌似只会生成迁移的模版,然后 upgrade 跟 downgrade 是需要自己实现的吧 😐。还是说我使用方式出错了
    IIce
        7
    IIce  
       12 天前
    @encro 这个工具不支持 mysql 吧
    TimeFlies12
        8
    TimeFlies12  
       12 天前
    @lzyong2019 alembic revision --autogenerate 会根据现有 Model 和数据库自动生成 upgrade & downgrade 迁移脚本。你使用的方式不对。另外也需要注意你的 db Model 是否被加载到
    encro
        9
    encro  
       12 天前
    @IIce

    好像真是啊,我现在主要用 pg 。
    niubee1
        10
    niubee1  
       12 天前
    fastapi+pydantic+sqlalchemy+alembic 整个一套,搞东西还是蛮快的
    bitmin
        11
    bitmin  
       12 天前
    我用 sqlmodel ,使用 pydantic 的模型更方便

    我很喜欢写起来像写 sql 的方式,只要会写 sql 就会用

    写起来就是

    select(func.IF(,,).label('a'), func.sum(), func.count()).select_from(A).join().outerjoin().where().group_by()

    update(A).where(and_(A.id == 1, A.status == 1)).values()

    delete(A).where(or_(A.status == 0, col(A.b).is_(None)))

    也可以

    a = await session.get(A, 1)

    a.b = c

    await session.commit()

    或者

    a = A()

    session.add(a)

    await session.commit()


    缺点是 sqlalchemy 每次查询都会开事务,我还配置不来不开事务,曲线救国自己封装了 asyncmy 一起用
    Gress
        12
    Gress  
       12 天前
    sqlalchemy 太难用了,实体类关联查询老容易 N+1 ,还得显式指定
    TimePPT
        13
    TimePPT  
       12 天前
    @bitmin
    sqlmodel demo 试了下,写起来是挺爽
    之前官方的 roadmap 里( https://github.com/fastapi/sqlmodel/issues/654 )说会加 Async tools and docs 和 Integrated migrations (using Alembic). 但好像一直没动静。
    所以我选择观望下 😂
    Jason168
        14
    Jason168  
       12 天前
    我用的 tortoise-orm 还行
    iorilu
        15
    iorilu  
       11 天前
    sqlalchemy 标配 alembic

    不过这东西上手没那么容易, 文档也不容易看明白
    UN2758
        16
    UN2758  
       11 天前
    emmmm ,要不看看 utilmeta ?除了 sse\websocket\stream response 和关系表创建有点问题外,其他情况下 orm 类似 django 风格也挺好用的
    izoabr
        17
    izoabr  
       11 天前   ❤️ 1
    最近好多人推 django-ninja ,也可以了解一下,我是习惯了 Django 的 ORM 的 filter ,用 select where 用不太习惯
    mingwiki
        18
    mingwiki  
       10 天前
    我还在用 peewee,简单好用 异步对我影响不大
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2418 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 22ms · UTC 16:02 · PVG 00:02 · LAX 08:02 · JFK 11:02
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.