From daa70299730ad46589f176ed69a58b30724088a4 Mon Sep 17 00:00:00 2001 From: Andreas Motl Date: Tue, 16 Jan 2024 00:58:10 +0100 Subject: [PATCH] Types: Improve type mappings - Consequently use upper-case type definitions from `sqlalchemy.types` - Add `timestamp without time zone` types (scalar and array) - On SQLAlchemy 2, map `real` and `double{_precision}` types to the newly introduced `sqltypes.{DOUBLE,DOUBLE_PRECISION}` types All of this is intended to improve reverse type lookups / reflections. --- docs/inspection-reflection.rst | 4 +-- src/sqlalchemy_cratedb/dialect.py | 57 ++++++++++++++++++------------- 2 files changed, 36 insertions(+), 25 deletions(-) diff --git a/docs/inspection-reflection.rst b/docs/inspection-reflection.rst index db252216..d6a3be58 100644 --- a/docs/inspection-reflection.rst +++ b/docs/inspection-reflection.rst @@ -87,10 +87,10 @@ Create a SQLAlchemy table object: Reflect column data types from the table metadata: >>> table.columns.get('name') - Column('name', String(), table=) + Column('name', VARCHAR(), table=) >>> table.primary_key - PrimaryKeyConstraint(Column('id', String(), table=, primary_key=True... + PrimaryKeyConstraint(Column('id', VARCHAR(), table=, primary_key=True... CrateDialect diff --git a/src/sqlalchemy_cratedb/dialect.py b/src/sqlalchemy_cratedb/dialect.py index aebad9c2..2152ea4e 100644 --- a/src/sqlalchemy_cratedb/dialect.py +++ b/src/sqlalchemy_cratedb/dialect.py @@ -36,40 +36,51 @@ from .type import ObjectArray, ObjectType TYPES_MAP = { - "boolean": sqltypes.Boolean, - "short": sqltypes.SmallInteger, - "smallint": sqltypes.SmallInteger, + "boolean": sqltypes.BOOLEAN, + "short": sqltypes.SMALLINT, + "smallint": sqltypes.SMALLINT, "timestamp": sqltypes.TIMESTAMP, "timestamp with time zone": sqltypes.TIMESTAMP, + "timestamp without time zone": sqltypes.TIMESTAMP, "object": ObjectType, - "integer": sqltypes.Integer, - "long": sqltypes.NUMERIC, - "bigint": sqltypes.NUMERIC, + "object_array": ObjectArray, # TODO: Can this also be improved to use `sqltypes.ARRAY`? + "integer": sqltypes.INTEGER, + "long": sqltypes.BIGINT, + "bigint": sqltypes.BIGINT, + "float": sqltypes.FLOAT, "double": sqltypes.DECIMAL, "double precision": sqltypes.DECIMAL, - "object_array": ObjectArray, - "float": sqltypes.Float, - "real": sqltypes.Float, - "string": sqltypes.String, - "text": sqltypes.String + "real": sqltypes.REAL, + "string": sqltypes.VARCHAR, + "text": sqltypes.VARCHAR, } try: # SQLAlchemy >= 1.1 from sqlalchemy.types import ARRAY - TYPES_MAP["integer_array"] = ARRAY(sqltypes.Integer) - TYPES_MAP["boolean_array"] = ARRAY(sqltypes.Boolean) - TYPES_MAP["short_array"] = ARRAY(sqltypes.SmallInteger) - TYPES_MAP["smallint_array"] = ARRAY(sqltypes.SmallInteger) + TYPES_MAP["integer_array"] = ARRAY(sqltypes.INTEGER) + TYPES_MAP["boolean_array"] = ARRAY(sqltypes.BOOLEAN) + TYPES_MAP["short_array"] = ARRAY(sqltypes.SMALLINT) + TYPES_MAP["smallint_array"] = ARRAY(sqltypes.SMALLINT) TYPES_MAP["timestamp_array"] = ARRAY(sqltypes.TIMESTAMP) TYPES_MAP["timestamp with time zone_array"] = ARRAY(sqltypes.TIMESTAMP) - TYPES_MAP["long_array"] = ARRAY(sqltypes.NUMERIC) - TYPES_MAP["bigint_array"] = ARRAY(sqltypes.NUMERIC) - TYPES_MAP["double_array"] = ARRAY(sqltypes.DECIMAL) - TYPES_MAP["double precision_array"] = ARRAY(sqltypes.DECIMAL) - TYPES_MAP["float_array"] = ARRAY(sqltypes.Float) - TYPES_MAP["real_array"] = ARRAY(sqltypes.Float) - TYPES_MAP["string_array"] = ARRAY(sqltypes.String) - TYPES_MAP["text_array"] = ARRAY(sqltypes.String) + TYPES_MAP["timestamp without time zone_array"] = ARRAY(sqltypes.TIMESTAMP) + TYPES_MAP["long_array"] = ARRAY(sqltypes.BIGINT) + TYPES_MAP["bigint_array"] = ARRAY(sqltypes.BIGINT) + TYPES_MAP["float_array"] = ARRAY(sqltypes.FLOAT) + TYPES_MAP["real_array"] = ARRAY(sqltypes.REAL) + TYPES_MAP["string_array"] = ARRAY(sqltypes.VARCHAR) + TYPES_MAP["text_array"] = ARRAY(sqltypes.VARCHAR) +except Exception: + pass +try: + # SQLAlchemy >= 2.0 + from sqlalchemy.types import DOUBLE, DOUBLE_PRECISION + TYPES_MAP["real"] = DOUBLE + TYPES_MAP["real_array"] = ARRAY(DOUBLE) + TYPES_MAP["double"] = DOUBLE + TYPES_MAP["double_array"] = ARRAY(DOUBLE) + TYPES_MAP["double precision"] = DOUBLE_PRECISION + TYPES_MAP["double precision_array"] = ARRAY(DOUBLE_PRECISION) except Exception: pass