From 4acfce6c4c1da91901921ddfae7a682771817945 Mon Sep 17 00:00:00 2001 From: Mike Bayer Date: Sat, 23 Nov 2013 17:19:43 -0500 Subject: - evaulate decimal_return_scale statelessly. Don't re-assign to self.decimal_return_scale so that __repr__() is maintained (for alembic tests) --- lib/sqlalchemy/dialects/mysql/base.py | 2 -- lib/sqlalchemy/dialects/oracle/cx_oracle.py | 2 +- lib/sqlalchemy/dialects/postgresql/psycopg2.py | 3 ++- lib/sqlalchemy/sql/sqltypes.py | 21 +++++++++++++-------- 4 files changed, 16 insertions(+), 12 deletions(-) (limited to 'lib') diff --git a/lib/sqlalchemy/dialects/mysql/base.py b/lib/sqlalchemy/dialects/mysql/base.py index 6ffc1319a..eec4d8a48 100644 --- a/lib/sqlalchemy/dialects/mysql/base.py +++ b/lib/sqlalchemy/dialects/mysql/base.py @@ -398,8 +398,6 @@ class _FloatType(_NumericType, sqltypes.Float): raise exc.ArgumentError( "You must specify both precision and scale or omit " "both altogether.") - if scale is not None: - kw.setdefault('decimal_return_scale', scale) super(_FloatType, self).__init__(precision=precision, asdecimal=asdecimal, **kw) self.scale = scale diff --git a/lib/sqlalchemy/dialects/oracle/cx_oracle.py b/lib/sqlalchemy/dialects/oracle/cx_oracle.py index 0c6d257dc..60267aab9 100644 --- a/lib/sqlalchemy/dialects/oracle/cx_oracle.py +++ b/lib/sqlalchemy/dialects/oracle/cx_oracle.py @@ -232,7 +232,7 @@ class _OracleNumeric(sqltypes.Numeric): if dialect.supports_native_decimal: if self.asdecimal: - fstring = "%%.%df" % self.decimal_return_scale + fstring = "%%.%df" % self._effective_decimal_return_scale def to_decimal(value): if value is None: diff --git a/lib/sqlalchemy/dialects/postgresql/psycopg2.py b/lib/sqlalchemy/dialects/postgresql/psycopg2.py index 9995a1f5a..d7ce6eb90 100644 --- a/lib/sqlalchemy/dialects/postgresql/psycopg2.py +++ b/lib/sqlalchemy/dialects/postgresql/psycopg2.py @@ -192,7 +192,8 @@ class _PGNumeric(sqltypes.Numeric): if self.asdecimal: if coltype in _FLOAT_TYPES: return processors.to_decimal_processor_factory( - decimal.Decimal, self.decimal_return_scale) + decimal.Decimal, + self._effective_decimal_return_scale) elif coltype in _DECIMAL_TYPES or coltype in _INT_TYPES: # pg8000 returns Decimal natively for 1700 return None diff --git a/lib/sqlalchemy/sql/sqltypes.py b/lib/sqlalchemy/sql/sqltypes.py index 7cf5a6dca..7c9a65166 100644 --- a/lib/sqlalchemy/sql/sqltypes.py +++ b/lib/sqlalchemy/sql/sqltypes.py @@ -503,12 +503,18 @@ class Numeric(_DateAffinity, TypeEngine): """ self.precision = precision self.scale = scale - self.decimal_return_scale = decimal_return_scale \ - if decimal_return_scale is not None \ - else self.scale if self.scale is not None \ - else self._default_decimal_return_scale + self.decimal_return_scale = decimal_return_scale self.asdecimal = asdecimal + @property + def _effective_decimal_return_scale(self): + if self.decimal_return_scale is not None: + return self.decimal_return_scale + elif getattr(self, "scale", None) is not None: + return self.scale + else: + return self._default_decimal_return_scale + def get_dbapi_type(self, dbapi): return dbapi.NUMBER @@ -626,9 +632,7 @@ class Float(Numeric): """ self.precision = precision self.asdecimal = asdecimal - self.decimal_return_scale = decimal_return_scale \ - if decimal_return_scale is not None \ - else self._default_decimal_return_scale + self.decimal_return_scale = decimal_return_scale if kwargs: util.warn_deprecated("Additional keyword arguments " "passed to Float ignored.") @@ -636,7 +640,8 @@ class Float(Numeric): def result_processor(self, dialect, coltype): if self.asdecimal: return processors.to_decimal_processor_factory( - decimal.Decimal, self.decimal_return_scale) + decimal.Decimal, + self._effective_decimal_return_scale) else: return None -- cgit v1.2.1