Open KKawamura1 opened 3 years ago
bumping this case, as this is also causing problems for me. thx @KKawamura1
Also experiencing this
A workaround to avoid resorting to any # type: ignore
s is to use typing.cast
:
def func_that_uses_the_column() -> float:
foo = db.query(Foo).first()
return cast(float, foo.float_column)
https://mypy.readthedocs.io/en/stable/casts.html#casts-and-type-assertions
@wlcx I think the main problem is assigning float
value to a Float
column. In order to do that, I have to Decimal(my_float_value)
to make mypy happy. But it also leads to problem that I'm injecting to database a Decimal value which is defined as Float
from sqlalchemy import Float
class Coordinate(Base):
__tablename__ = 'coordinates'
latitude = Column(Float) #sqlalchemy-stub infers this column as Decimal
longitude = Column(Float)
coord = Coordinate(
latitude=50.5, #mypy complains that this value need to be Decimal
longitude=60.5,
)
from decimal import Decimal
coord_2= Coordinate(
latitude=Decimal(50.5), #works fine
longitude=Decimal(60.5),
)
This problem also occurs when using only Float
columns:
from sqlalchemy import Column, Float, Integer
from sqlalchemy.ext.declarative import declarative_base
Base = declarative_base()
class MyModel(Base):
__tablename__ = "my_model"
id = Column(Integer, primary_key=True)
value = Column(Float, nullable=False)
def f(data: MyModel) -> None:
reveal_type(data.value)
Expected output:
testcase.py:15: note: Revealed type is "builtins.float*"
Actual output:
testcase.py:15: note: Revealed type is "decimal.Decimal*"
I'm currently using the following workaround:
from typing import cast
from sqlalchemy import Float as Float_org
from sqlalchemy.sql.type_api import TypeEngine
Float = cast(type[TypeEngine[float]], Float_org)
But it would be nice if this could be fixed in the stubs.
Related to: https://github.com/dropbox/sqlalchemy-stubs/issues/131
About
https://github.com/dropbox/sqlalchemy-stubs/pull/132 fixed https://github.com/dropbox/sqlalchemy-stubs/issues/131, a bug that
sqlalchemy.Numeric
was treated as float, notdecimal.Decimal
. But it may introduce a new bug, thatsqlalchemy.Float
is also treated asdecimal.Decimal
, not float.To reproduce
Assigning a float value to
sqlalchemy.Float
is enough to reproduce this bug.Below is a sample code to reproduce:
Expected result
Environment