Ask HN: Python ORM Solutions in 2025?

2 points by kietay 4 months ago

We are currently using SQLAlchemy extensively for Python to PostgreSQL interactions. I have found the experience almost universally terrible, there is very little static type hinting, unexpected API choices and runtime errors.

I was expecting there to be a popular, modern, Pydantic like ORM tool for defining well typed DB tables in Python and was very surprised to find that not the case. After spending some time looking into this it seems there are a few very young projects (tortoise, piccolo etc) but no well-known, stable solution.

What are folks using for DB interactions in Python and what has your experience been?

kolanos 4 months ago

SQLAlchemy is still arguably the most featureful and robust ORM in Python (although it is much more than an ORM). It is likely the best default choice unless you're already working within a framework that offers its own ORM.

SQLAlchemy does support type annotations [0], am curious what issues you're running into there?

[0]: https://docs.sqlalchemy.org/en/20/orm/extensions/mypy.html

  • kietay 4 months ago

    One example: ``` class Base(DeclarativeBase): pass

    class Foo(Base): name: Mapped[str]

    x = Foo() ```

    does not get caught as a type error statically, I'm assuming because all records are treated as mutable.

    However, `x = Foo(name=2)` also doesn't get caught by pyright, which seems wrong. I could be misusing somehow though.

    • kolanos 4 months ago

      I don't think SQLAlchemy officially supports pyright,, although it would be great if they did given all the headaches people have had with mypy.

  • kietay 4 months ago

    Oh wow, just found the `MappedAsDataclass` release in 2.0. This is exactly what I'm looking for, thanks!