diff options
author | Mike Bayer <mike_mp@zzzcomputing.com> | 2017-06-26 16:50:24 -0400 |
---|---|---|
committer | Mike Bayer <mike_mp@zzzcomputing.com> | 2017-06-26 16:50:24 -0400 |
commit | 563180f7d46b24bd334d227104c90bf8cdb81158 (patch) | |
tree | e4423138b130b9fc248e2bae3a3cd0cca5771a59 | |
parent | 33d083c0347ccfb80fa546b0a580035ac7c48983 (diff) | |
download | sqlalchemy-563180f7d46b24bd334d227104c90bf8cdb81158.tar.gz |
Coerce to float for Float with all native decimal backends
The result processor for the :class:`.Float` type now unconditionally
runs values through the ``float()`` processor if the dialect
specifies that it also supports "native decimal" mode. While most
backends will deliver Python ``float`` objects for a floating point
datatype, the MySQL backends in some cases lack the typing information
in order to provide this and return ``Decimal`` unless the float
conversion is done.
Change-Id: I638f1480fb00a507036efaf0e0080f26893d98ad
Fixes: #4020
-rw-r--r-- | doc/build/changelog/changelog_12.rst | 16 | ||||
-rw-r--r-- | doc/build/changelog/migration_12.rst | 9 | ||||
-rw-r--r-- | lib/sqlalchemy/sql/sqltypes.py | 2 | ||||
-rw-r--r-- | lib/sqlalchemy/testing/suite/test_types.py | 1 |
4 files changed, 27 insertions, 1 deletions
diff --git a/doc/build/changelog/changelog_12.rst b/doc/build/changelog/changelog_12.rst index 043f5f1ac..7060d04db 100644 --- a/doc/build/changelog/changelog_12.rst +++ b/doc/build/changelog/changelog_12.rst @@ -29,6 +29,22 @@ :ref:`change_floats_12` + .. change:: 4020 + :tags: bug, sql, mysql + :tickets: 4020 + + The result processor for the :class:`.Float` type now unconditionally + runs values through the ``float()`` processor if the dialect + specifies that it also supports "native decimal" mode. While most + backends will deliver Python ``float`` objects for a floating point + datatype, the MySQL backends in some cases lack the typing information + in order to provide this and return ``Decimal`` unless the float + conversion is done. + + .. seealso:: + + :ref:`change_floats_12` + .. change:: 4017 :tags: bug, sql :tickets: 4017 diff --git a/doc/build/changelog/migration_12.rst b/doc/build/changelog/migration_12.rst index a1aeaf1f2..b5594f07c 100644 --- a/doc/build/changelog/migration_12.rst +++ b/doc/build/changelog/migration_12.rst @@ -801,9 +801,18 @@ if the application is working with plain floats. expr = column('a', Integer) * column('b', Float()) assert isinstance(expr.type, Float) +* The :class:`.Float` datatype will apply the ``float()`` processor to + result values unconditionally if the DBAPI is known to support native + ``Decimal()`` mode. Some backends do not always guarantee that a floating + point number comes back as plain float and not precision numeric such + as MySQL. :ticket:`4017` +:ticket:`4018` + +:ticket:`4020` + Key Behavioral Changes - ORM ============================ diff --git a/lib/sqlalchemy/sql/sqltypes.py b/lib/sqlalchemy/sql/sqltypes.py index 5b53f390e..6838baa5f 100644 --- a/lib/sqlalchemy/sql/sqltypes.py +++ b/lib/sqlalchemy/sql/sqltypes.py @@ -702,6 +702,8 @@ class Float(Numeric): return processors.to_decimal_processor_factory( decimal.Decimal, self._effective_decimal_return_scale) + elif dialect.supports_native_decimal: + return processors.to_float else: return None diff --git a/lib/sqlalchemy/testing/suite/test_types.py b/lib/sqlalchemy/testing/suite/test_types.py index de32e77a4..a345454be 100644 --- a/lib/sqlalchemy/testing/suite/test_types.py +++ b/lib/sqlalchemy/testing/suite/test_types.py @@ -431,7 +431,6 @@ class NumericTest(_LiteralRoundTripFixture, fixtures.TestBase): filter_=lambda n: n is not None and round(n, 5) or None ) - @testing.fails_on("mysql", "until we do #4020") def test_float_coerce_round_trip(self): expr = 15.7563 |