Hi All,

I've hit a little deadlock.

We want to use SQLAlchemy 2.x ORM typing (Mapped[...] =
mapped_column(...)) with
PEP 604 union types (int | None) in model annotations and must support
Python 3.9 (which does not support int | None at runtime).

We do not want to use Optional[...] (ruff UP007 is enforced). And, we
already have from __future__ import annotations everywhere. And getting
error like:

sqlalchemy.orm.exc.MappedAnnotationError: Could not resolve all types within
mapped annotation: "Mapped[int | None]"

TypeError: unsupported operand type(s) for |: 'type' and 'NoneType'

mypy/ruff are not happy with Mapped[Optional[int]] (*ruff UP007*), and
SQLAlchemy 2.x cannot parse Mapped[int | None] on Python 3.9.

With from __future__ import annotations, SQLAlchemy stores the annotation
as a string. At runtime, it tries to eval() the string in the module's
namespace. On Python 3.9, eval("int | None") fails.

Need help and suggestion on how shall I proceed?

Thanks,

Avi

Reply via email to