summaryrefslogtreecommitdiff
path: root/lib/sqlalchemy
diff options
context:
space:
mode:
authorMike Bayer <mike_mp@zzzcomputing.com>2013-11-23 17:19:43 -0500
committerMike Bayer <mike_mp@zzzcomputing.com>2013-11-23 17:19:43 -0500
commit4acfce6c4c1da91901921ddfae7a682771817945 (patch)
treee690ac0c728b15d79709a13c5601d4ed9dd0466f /lib/sqlalchemy
parent50634fcb2d29d3af17cb5b6cb0d12fdf8edaa98e (diff)
downloadsqlalchemy-4acfce6c4c1da91901921ddfae7a682771817945.tar.gz
- evaulate decimal_return_scale statelessly. Don't re-assign to self.decimal_return_scale
so that __repr__() is maintained (for alembic tests)
Diffstat (limited to 'lib/sqlalchemy')
-rw-r--r--lib/sqlalchemy/dialects/mysql/base.py2
-rw-r--r--lib/sqlalchemy/dialects/oracle/cx_oracle.py2
-rw-r--r--lib/sqlalchemy/dialects/postgresql/psycopg2.py3
-rw-r--r--lib/sqlalchemy/sql/sqltypes.py21
4 files changed, 16 insertions, 12 deletions
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