|
19 | 19 | """Support for IBM DB2 database |
20 | 20 |
|
21 | 21 | """ |
| 22 | +import sqlalchemy |
22 | 23 | import datetime, re |
23 | 24 | from sqlalchemy import types as sa_types |
24 | 25 | from sqlalchemy import schema as sa_schema |
|
28 | 29 | from sqlalchemy.engine import default |
29 | 30 | from sqlalchemy import __version__ as SA_Version |
30 | 31 | 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 | + ) |
35 | 68 |
|
36 | 69 | SA_Version = [int(ver_token) for ver_token in SA_Version.split('.')[0:2]] |
37 | 70 |
|
@@ -453,13 +486,32 @@ def visit_function(self, func, result_map=None, **kwargs): |
453 | 486 | def visit_cast(self, cast, **kw): |
454 | 487 | type_ = cast.typeclause.type |
455 | 488 |
|
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): |
463 | 515 | return super(DB2Compiler, self).visit_cast(cast, **kw) |
464 | 516 | else: |
465 | 517 | return self.process(cast.clause) |
|
0 commit comments