sqlalchemy2-stubs icon indicating copy to clipboard operation
sqlalchemy2-stubs copied to clipboard

Columns with `nullable=False` are typed as optional

Open peteris-zealid opened this issue 3 years ago • 3 comments

Describe the bug Table columns have optional[T] type even when they are defined with nullable=False

Expected behavior Expected for type to be just "builtins.str" (not optional)

To Reproduce

# Most of this is copy pasted from documentation
from sqlalchemy import Column
from sqlalchemy import Integer
from sqlalchemy import String
from sqlalchemy import select
from sqlalchemy.orm import declarative_base

Base = declarative_base()

class User(Base):
    __tablename__ = 'user'

    id = Column(Integer, primary_key=True)
    name = Column(String, nullable=False)  #  <------------ Added nullable=False here

some_user = User(id=5, name='user')

reveal_type(some_user.name)  # <-------- Revealed type is "Union[builtins.str, None]" 

# Expected for type to be just "builtins.str" (not optional)

Versions.

  • OS:
  • Python: 3.8.9
  • SQLAlchemy: 1.4.27
  • mypy: 0.910
  • SQLAlchemy2-stubs: 0.0.2a19

Have a nice day! Thank you, you too. You do not see this a lot on the internet. Really appreciate it.

peteris-zealid avatar Jan 12 '22 14:01 peteris-zealid

if you are using the mypy plugin, this is expected for the 1.4 series, see https://docs.sqlalchemy.org/en/14/orm/extensions/mypy.html#introspection-of-columns-based-on-typeengine

in 2.0 we will be using a completely different approach for this.

zzzeek avatar Jan 12 '22 14:01 zzzeek

You are correct. Sorry for not reading the manual. You should probably close the issue now.

peteris-zealid avatar Jan 12 '22 14:01 peteris-zealid

no worries at all , i will likely be switching this behavior for 2.0's approach (which won't use the plugin).

zzzeek avatar Jan 12 '22 15:01 zzzeek