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

SQLModel

  •  2
     
  •   Livid · 2021-08-31 17:50:17 +08:00 · 5907 次点击
    这是一个创建于 1204 天前的主题,其中的信息可能已经有所发展或是发生改变。
    27 条回复    2021-09-03 10:58:47 +08:00
    learningman
        1
    learningman  
       2021-08-31 20:53:15 +08:00 via Android
    传统的那几个 orm,peewee 啥的在 fastapi 用都挺蛋疼的
    superrichman
        2
    superrichman  
       2021-08-31 21:00:51 +08:00
    一周 4 千 star,真 NB 。
    coolcatha
        3
    coolcatha  
       2021-08-31 21:24:23 +08:00 via iPhone
    就感觉,这个作者挺会起名字的,fastapi sqlmodel 听起来都很厉害
    mmdsun
        4
    mmdsun  
       2021-08-31 22:07:41 +08:00 via Android   ❤️ 6
    用过 Entity Framework Core
    你会发现其他 O/RM 都用不下去了。

    我用过很多 ORM 库。hibernate,JPA 。Python 的,SQLalchemy,Django 都用过。没一个好用的。。
    yccalculus
        5
    yccalculus  
       2021-08-31 22:20:40 +08:00
    @mmdsun 试试 sqlsugar
    janxin
        6
    janxin  
       2021-08-31 22:34:55 +08:00
    @mmdsun 要么试试 Python 的 Pony
    janxin
        7
    janxin  
       2021-08-31 22:38:25 +08:00
    SQLModel 相当于在 Pydantic 和 SQLAlchemy 之间加了一层兼容适配,其实还是可以的。不过其实我觉得直接把 SQLAlchemy 包起来比较好,现在还需要手工引入 SQLAlchemy 的相关东西
    LeeReamond
        8
    LeeReamond  
       2021-08-31 23:28:54 +08:00
    好奇底层实现原理,因为 sqlalchemy 毕竟是同步的。所以它是以一个单线程运行 sqlalchemy,然后搞了一个异步事务中心来安排业务上的请求?然后如果我要使用 oracle 的话那 sqlalchemy 还要再把请求转发到 cxoracle 来执行。。。套娃之终极套娃啊
    so1n
        9
    so1n  
       2021-08-31 23:35:53 +08:00
    @LeeReamond sqlalchemy 把生成 sql 和执行 sql 拆分了 asyncio 的 orm 都只用到 sqlalchemy 的生成部分
    so1n
        10
    so1n  
       2021-09-01 00:32:54 +08:00
    @LeeReamond 然后最新版本的 sqlalchemy 也支持异步了
    chroming
        11
    chroming  
       2021-09-01 00:35:29 +08:00
    正好公司项目在用 fastapi 和 SQLAlchemy,尝试一下这个
    coolcatha
        12
    coolcatha  
       2021-09-01 09:09:18 +08:00
    @mmdsun 我感觉 Django 的很不错了啊!能说说这些大概有哪些问题吗?
    qW7bo2FbzbC0
        13
    qW7bo2FbzbC0  
       2021-09-01 09:47:26 +08:00
    @mmdsun #4 NPoco 也不错,EF 我感觉有点重
    mywaiting
        14
    mywaiting  
       2021-09-01 09:53:15 +08:00
    RAW SQL 语句一把梭,容易理解,也不用再多学一门关于 ORM 的“方言”
    Vegetable
        15
    Vegetable  
       2021-09-01 09:58:13 +08:00
    @mywaiting 总有人说 sql 一把梭,我非常好奇你们写测试吗?你们测试能在 sqlite 或者 h2 之类的数据库上跑起来吗?反正用 orm 不在意这些。
    sudoy
        16
    sudoy  
       2021-09-01 10:17:45 +08:00
    我刚刚准备好好学一学 SQLAlchemy 呢,就看到这个了,看起来不错的样子
    micean
        17
    micean  
       2021-09-01 10:29:19 +08:00
    @Vegetable

    orm 能写 merge into/insert ignore/insert on conflict/with as/select from partition 吗?
    mywaiting
        18
    mywaiting  
       2021-09-01 10:44:08 +08:00
    @Vegetable 测试有写的,在对应的数据库写入测试数据简单测试即可

    在数据表结构确定的情况下,SQL 语句是一目了然的,无论是写测试用例还是后期维护都相当简单
    ospider
        19
    ospider  
       2021-09-01 11:09:15 +08:00
    别开新坑了,我就关心啥时候能把 FastAPI 的 API Reference 加上……查个参数还得去 tutorial 里翻,服了
    l4ever
        20
    l4ever  
       2021-09-01 13:19:56 +08:00
    初步看了一下文档, 看起来像 SQLAlchemy.
    2i2Re2PLMaDnghL
        21
    2i2Re2PLMaDnghL  
       2021-09-01 13:38:17 +08:00
    Pydantic 和 SQLAlchemy 结合必会诞生的。
    我都快自己动手了。
    Rwing
        22
    Rwing  
       2021-09-01 14:09:42 +08:00   ❤️ 4
    还有很多人没明白 ORM 与 db helper 或者叫 db tool 的区别。
    ORM 里很重要的一点是关系映射 Relational Mapping,如何让 db 中的数据以 object 的形式存在。

    举个应该是 ORM 基础功能的简单的例子来说:
    var zhangsan = new Student("张三");
    var lisi = new Teacher("李四");
    zhangsan.Teacher = lisi ;
    db.Save(zhangsan);
    这时数据库中应该创建了叫张三的学生以及李四的老师,并且张三的老师外键 id 是李四的 id

    如果连这个都没法处理,那连 ORM 都不能叫
    Macv1994
        25
    Macv1994  
       2021-09-01 16:11:34 +08:00
    看了下,跟 SQLAlchemy 很像啊
    frostming
        26
    frostming  
       2021-09-03 10:46:04 +08:00   ❤️ 3
    都闪开,让我吐槽

    1. 不是像 SQLAlchemy (简称 SQLA ),根本就是包了一下 SQLAlchemy,大家不要觉得 ORM 很高大上,现在新出的 python ORM 无一例外都是 SQLA 套壳,这个 SQLModel 更过分,里面除了 main.py 是和 pydantic 互通的部分,其他都是 import SQLA 的类加上泛型标注又放出去的(大家看过代码就知道我没有乱说)
    2. 所以这个只能叫做「 SQLA 的扩展」不能叫做一个新的 ORM,该起名叫「 sqla-pydantic 」但那样怎么营销?
    3. 作者擅长营销和文档,他在文档里放了一个 tutorial,居然是教你如何用 ORM CRUD,这个就是更初学者友好的 SQLA 文档啊,ORM 哪个核心功能是他写的呢?不要说 SQLA 文档看不懂,其实已经有很大进步了。
    4. sqla-pydantic 的连接确实在 fastapi 里非常需要,但我相信之前也有很多人自己做过,不是很难。
    5. 还记得 pydantic 被 PEP 563 坑的事情吗? https://github.com/samuelcolvin/pydantic/issues/2678,这个如果没解决好,任何在 Pydantic 之上的库全得废
    6. SQLA 是支持异步的,但作者在文档里最重要的 quick start 例子里居然用的同步。
    7. 如果言语过激请原谅,这是看过代码之后的感想,并不是酸。
    abersheeran
        27
    abersheeran  
       2021-09-03 10:58:47 +08:00   ❤️ 1
    修复一下上面的链接: https://github.com/samuelcolvin/pydantic/issues/2678

    支持楼上 frostming 的说法。另外,fastapi 的性能本就没有他宣传的好,如果还用同步代码,那就更差劲了,比 Django 还慢。而作者本人给出的样例居然是同步的,属实逗笑我了。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   3686 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 04:16 · PVG 12:16 · LAX 20:16 · JFK 23:16
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.