Skip to content

Data type for Float column should be float, not Decimal #178

@KKawamura1

Description

@KKawamura1

Related to: #131

About

#132 fixed #131, a bug that sqlalchemy.Numeric was treated as float, not decimal.Decimal.
But it may introduce a new bug, that sqlalchemy.Float is also treated as decimal.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:

from decimal import Decimal
from sqlalchemy import Column, Float, Numeric, Integer
from sqlalchemy.ext.declarative import declarative_base


Base = declarative_base()


class Numbers(Base):
    __tablename__ = "numbers"
    id_ = Column(Integer, primary_key=True)

    c_numeric = Column(Numeric, nullable=False)
    c_numeric_as_decimal = Column(Numeric(asdecimal=True), nullable=False)
    c_numeric_as_float = Column(Numeric(asdecimal=False), nullable=False)
    c_float = Column(Float, nullable=False)


def in_float() -> None:
    number = 1.0
    numbers = Numbers(c_numeric=number, c_numeric_as_decimal=number, c_numeric_as_float=number, c_float=number)
    print(type(numbers.c_numeric), type(numbers.c_numeric_as_decimal), type(numbers.c_numeric_as_float), type(numbers.c_float))

def in_decimal() -> None:
    number = Decimal(1.0)
    numbers = Numbers(c_numeric=number, c_numeric_as_decimal=number, c_numeric_as_float=number, c_float=number)
    print(type(numbers.c_numeric), type(numbers.c_numeric_as_decimal), type(numbers.c_numeric_as_float), type(numbers.c_float))

in_float()
in_decimal()
$ mypy foo.py
foo.py:21: error: Incompatible type for "c_numeric" of "Numbers" (got "float", expected "Decimal")
foo.py:21: error: Incompatible type for "c_numeric_as_decimal" of "Numbers" (got "float", expected "Decimal")
foo.py:21: error: Incompatible type for "c_numeric_as_float" of "Numbers" (got "float", expected "Decimal")
foo.py:21: error: Incompatible type for "c_float" of "Numbers" (got "float", expected "Decimal")
Found 4 errors in 1 file (checked 1 source file)

Expected result

$ mypy foo.py
foo.py:21: error: Incompatible type for "c_numeric" of "Numbers" (got "float", expected "Decimal")
foo.py:21: error: Incompatible type for "c_numeric_as_decimal" of "Numbers" (got "float", expected "Decimal")
foo.py:26: error: Incompatible type for "c_numeric_as_float" of "Numbers" (got "Decimal", expected "float")  # this one
foo.py:26: error: Incompatible type for "c_float" of "Numbers" (got "Decimal", expected "float")  # this one
Found 4 errors in 1 file (checked 1 source file)

Environment

$ (cd sqlalchemy-stubs && git rev-parse HEAD)
55470ceab8149db983411d5c094c9fe16343c58b
$ python -c "import sqlalchemy; print(sqlalchemy.__version__)"
1.3.20
$ python -V
Python 3.8.2
$ mypy -V
mypy 0.790

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type
    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions