summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMike Bayer <mike_mp@zzzcomputing.com>2010-03-18 12:05:20 -0400
committerMike Bayer <mike_mp@zzzcomputing.com>2010-03-18 12:05:20 -0400
commit77fa087d1577dedbb18c197641bf81e6d0862505 (patch)
tree38b3170137e9318e976bad197ae6aafb31de7d26
parent074cab9e7d01533302e84a489d740accad25476a (diff)
downloadsqlalchemy-77fa087d1577dedbb18c197641bf81e6d0862505.tar.gz
turning the decimals to floats allows the E notation to work with sybase+pyodbc for small E notations
-rw-r--r--lib/sqlalchemy/dialects/mssql/base.py3
-rw-r--r--lib/sqlalchemy/dialects/sybase/base.py6
-rw-r--r--lib/sqlalchemy/dialects/sybase/pyodbc.py26
-rw-r--r--test/sql/test_types.py1
4 files changed, 30 insertions, 6 deletions
diff --git a/lib/sqlalchemy/dialects/mssql/base.py b/lib/sqlalchemy/dialects/mssql/base.py
index 070650d97..6425291c8 100644
--- a/lib/sqlalchemy/dialects/mssql/base.py
+++ b/lib/sqlalchemy/dialects/mssql/base.py
@@ -283,7 +283,8 @@ class _MSNumeric(sqltypes.Numeric):
# TODO: this seems exceedingly complex.
# need to know exactly what tests cover this, so far
# test_types.NumericTest.test_enotation_decimal
-
+ # see the _SybNumeric type in sybase/pyodbc for possible
+ # generalized solution on pyodbc
if isinstance(value, decimal.Decimal):
if value.adjusted() < 0:
result = "%s0.%s%s" % (
diff --git a/lib/sqlalchemy/dialects/sybase/base.py b/lib/sqlalchemy/dialects/sybase/base.py
index e182cc9e7..5814f70da 100644
--- a/lib/sqlalchemy/dialects/sybase/base.py
+++ b/lib/sqlalchemy/dialects/sybase/base.py
@@ -85,6 +85,7 @@ RESERVED_WORDS = set([
"within", "work", "writetext",
])
+
class _SybaseUnitypeMixin(object):
"""these types appear to return a buffer object."""
@@ -161,9 +162,6 @@ class SybaseTypeCompiler(compiler.GenericTypeCompiler):
def visit_UNIQUEIDENTIFIER(self, type_):
return "UNIQUEIDENTIFIER"
-colspecs = {
-}
-
ischema_names = {
'integer' : INTEGER,
'unsigned int' : INTEGER, # TODO: unsigned flags
@@ -359,7 +357,7 @@ class SybaseDialect(default.DefaultDialect):
supports_unicode_binds = False
postfetch_lastrowid = True
- colspecs = colspecs
+ colspecs = {}
ischema_names = ischema_names
type_compiler = SybaseTypeCompiler
diff --git a/lib/sqlalchemy/dialects/sybase/pyodbc.py b/lib/sqlalchemy/dialects/sybase/pyodbc.py
index 1bb09251c..61cf333da 100644
--- a/lib/sqlalchemy/dialects/sybase/pyodbc.py
+++ b/lib/sqlalchemy/dialects/sybase/pyodbc.py
@@ -31,6 +31,26 @@ Currently *not* supported are::
from sqlalchemy.dialects.sybase.base import SybaseDialect, SybaseExecutionContext
from sqlalchemy.connectors.pyodbc import PyODBCConnector
+import decimal
+from sqlalchemy import processors, types as sqltypes
+
+# TODO: should this be part of pyodbc connectors ??? applies to MSSQL too ?
+class _SybNumeric(sqltypes.Numeric):
+ def bind_processor(self, dialect):
+ super_process = super(_SybNumeric, self).bind_processor(dialect)
+
+ def process(value):
+ if self.asdecimal and \
+ isinstance(value, decimal.Decimal) and \
+ value.adjusted() < -6:
+ return processors.to_float(value)
+ elif super_process:
+ return super_process(value)
+ else:
+ return value
+ return process
+
+
class SybaseExecutionContext_pyodbc(SybaseExecutionContext):
def set_ddl_autocommit(self, connection, value):
if value:
@@ -39,7 +59,13 @@ class SybaseExecutionContext_pyodbc(SybaseExecutionContext):
connection.autocommit = False
+
class SybaseDialect_pyodbc(PyODBCConnector, SybaseDialect):
execution_ctx_cls = SybaseExecutionContext_pyodbc
+ colspecs = {
+ sqltypes.Numeric:_SybNumeric,
+ sqltypes.Float:sqltypes.Float,
+ }
+
dialect = SybaseDialect_pyodbc
diff --git a/test/sql/test_types.py b/test/sql/test_types.py
index 507ca5a09..56eca39ac 100644
--- a/test/sql/test_types.py
+++ b/test/sql/test_types.py
@@ -1155,7 +1155,6 @@ class NumericTest(TestBase, AssertsExecutionResults):
finally:
t.drop(testing.db)
- @testing.fails_on('sybase', "Driver doesn't appear to handle E notation, won't accept strings")
def test_enotation_decimal(self):
"""test exceedingly small decimals.