Skip to content

Commit 229aad9

Browse files
Fix: Add sqlalchemy.types.DOUBLE to dependency version specification (#166)
Signed-off-by: Balram Choudhary <[email protected]>
1 parent bb1fcbd commit 229aad9

1 file changed

Lines changed: 63 additions & 11 deletions

File tree

ibm_db_sa/base.py

Lines changed: 63 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919
"""Support for IBM DB2 database
2020
2121
"""
22+
import sqlalchemy
2223
import datetime, re
2324
from sqlalchemy import types as sa_types
2425
from sqlalchemy import schema as sa_schema
@@ -28,10 +29,42 @@
2829
from sqlalchemy.engine import default
2930
from sqlalchemy import __version__ as SA_Version
3031
from . import reflection as ibm_reflection
31-
32-
from sqlalchemy.types import BLOB, CHAR, CLOB, DATE, DATETIME, INTEGER, \
33-
SMALLINT, BIGINT, DECIMAL, NUMERIC, REAL, TIME, TIMESTAMP, \
34-
VARCHAR, FLOAT
32+
from packaging import version
33+
34+
SQLALCHEMY_VERSION = version.parse(sqlalchemy.__version__)
35+
36+
if SQLALCHEMY_VERSION >= version.parse("2.0"):
37+
from sqlalchemy.sql.sqltypes import NullType, NULLTYPE, _Binary
38+
from sqlalchemy.sql.sqltypes import (
39+
ARRAY, BIGINT, BigInteger, BINARY, BLOB, BOOLEAN, Boolean,
40+
CHAR, CLOB, Concatenable, DATE, Date, DATETIME, DateTime,
41+
DECIMAL, DOUBLE, Double, DOUBLE_PRECISION, Enum, FLOAT, Float,
42+
Indexable, INT, INTEGER, Integer, Interval, JSON, LargeBinary,
43+
MatchType, NCHAR, NUMERIC, Numeric, NVARCHAR,
44+
PickleType, REAL, SchemaType, SMALLINT, SmallInteger, String,
45+
STRINGTYPE, TEXT, Text, TIME, Time, TIMESTAMP, TupleType,
46+
Unicode, UnicodeText, UUID, Uuid, VARBINARY, VARCHAR
47+
)
48+
from sqlalchemy.sql.type_api import (
49+
adapt_type, ExternalType, to_instance, TypeDecorator, TypeEngine,
50+
UserDefinedType, Variant
51+
)
52+
else:
53+
from sqlalchemy.sql.sqltypes import NullType, NULLTYPE, _Binary
54+
from sqlalchemy.sql.sqltypes import (
55+
ARRAY, BIGINT, BigInteger, BINARY, BLOB, BOOLEAN, Boolean,
56+
CHAR, CLOB, Concatenable, DATE, Date, DATETIME, DateTime,
57+
DECIMAL, Enum, FLOAT, Float, Indexable, INT, INTEGER, Integer,
58+
Interval, JSON, LargeBinary, MatchType, NCHAR,
59+
NUMERIC, Numeric, NVARCHAR, PickleType, REAL,
60+
SchemaType, SMALLINT, SmallInteger, String, STRINGTYPE, TEXT,
61+
Text, TIME, Time, TIMESTAMP, TupleType, Unicode, UnicodeText,
62+
VARBINARY, VARCHAR
63+
)
64+
from sqlalchemy.sql.type_api import (
65+
adapt_type, ExternalType, to_instance, TypeDecorator, TypeEngine,
66+
UserDefinedType, Variant
67+
)
3568

3669
SA_Version = [int(ver_token) for ver_token in SA_Version.split('.')[0:2]]
3770

@@ -453,13 +486,32 @@ def visit_function(self, func, result_map=None, **kwargs):
453486
def visit_cast(self, cast, **kw):
454487
type_ = cast.typeclause.type
455488

456-
# TODO: verify that CAST shouldn't be called with
457-
# other types, I was able to CAST against VARCHAR
458-
# for example
459-
if isinstance(type_, (
460-
sa_types.DateTime, sa_types.Date, sa_types.Time, sa_types.DOUBLE, sa_types.Double, sa_types.Integer, sa_types.INTEGER,
461-
sa_types.Boolean, sa_types.BOOLEAN, sa_types.BIGINT, sa_types.BigInteger, sa_types.BINARY, sa_types.NUMERIC, sa_types.SmallInteger,
462-
sa_types.DECIMAL, sa_types.String, sa_types.Float, sa_types.FLOAT, sa_types.Numeric)):
489+
if SQLALCHEMY_VERSION >= version.parse("2.0"):
490+
valid_types = (
491+
CHAR, VARCHAR, CLOB, String, Text, Unicode, UnicodeText,
492+
BLOB, LargeBinary, VARBINARY,
493+
SMALLINT, SmallInteger,
494+
INTEGER, Integer,
495+
BIGINT, BigInteger,
496+
DECIMAL, NUMERIC, Float, REAL, DOUBLE, Double, Numeric,
497+
DATE, Date, TIME, Time, TIMESTAMP, DateTime,
498+
BOOLEAN, Boolean,
499+
NullType
500+
)
501+
else:
502+
valid_types = (
503+
CHAR, VARCHAR, CLOB, String, Text, Unicode, UnicodeText,
504+
BLOB, LargeBinary, VARBINARY,
505+
SMALLINT, SmallInteger,
506+
INTEGER, Integer,
507+
BIGINT, BigInteger,
508+
DECIMAL, NUMERIC, Float, REAL, Numeric,
509+
DATE, Date, TIME, Time, TIMESTAMP, DateTime,
510+
BOOLEAN, Boolean,
511+
NullType
512+
)
513+
514+
if isinstance(type_, valid_types):
463515
return super(DB2Compiler, self).visit_cast(cast, **kw)
464516
else:
465517
return self.process(cast.clause)

0 commit comments

Comments
 (0)