Skip to content

Error in reflecting a table with columns TIMESTAMP(0) #31

@Tariq1981

Description

@Tariq1981

Dears,
I got the following trace back error when the table which I am reflecting has columns of type TIMESTAMP(0)

Traceback (most recent call last):

File "", line 1, in
dial=sa.Table('H_DIAL',meta,schema='TDSTATS',autoload=True, autoload_with=engine)

File "C:\Program Files\Anaconda3\lib\site-packages\sqlalchemy\sql\schema.py", line 439, in new
metadata._remove_table(name, schema)

File "C:\Program Files\Anaconda3\lib\site-packages\sqlalchemy\util\langhelpers.py", line 66, in exit
compat.reraise(exc_type, exc_value, exc_tb)

File "C:\Program Files\Anaconda3\lib\site-packages\sqlalchemy\util\compat.py", line 187, in reraise
raise value

File "C:\Program Files\Anaconda3\lib\site-packages\sqlalchemy\sql\schema.py", line 434, in new
table._init(name, metadata, *args, **kw)

File "C:\Program Files\Anaconda3\lib\site-packages\sqlalchemy\sql\schema.py", line 514, in _init
include_columns, _extend_on=_extend_on)

File "C:\Program Files\Anaconda3\lib\site-packages\sqlalchemy\sql\schema.py", line 527, in _autoload
_extend_on=_extend_on

File "C:\Program Files\Anaconda3\lib\site-packages\sqlalchemy\engine\base.py", line 2045, in run_callable
return conn.run_callable(callable_, *args, **kwargs)

File "C:\Program Files\Anaconda3\lib\site-packages\sqlalchemy\engine\base.py", line 1534, in run_callable
return callable_(self, *args, **kwargs)

File "C:\Program Files\Anaconda3\lib\site-packages\sqlalchemy\engine\default.py", line 372, in reflecttable
table, include_columns, exclude_columns, **opts)

File "C:\Program Files\Anaconda3\lib\site-packages\sqlalchemy\engine\reflection.py", line 598, in reflecttable
table_name, schema, **table.dialect_kwargs):

File "C:\Program Files\Anaconda3\lib\site-packages\sqlalchemy\engine\reflection.py", line 369, in get_columns
**kw)

File "C:\Program Files\Anaconda3\lib\site-packages\sqlalchemy_teradata\dialect.py", line 183, in get_columns
return [self._get_column_info(row) for row in res]

File "C:\Program Files\Anaconda3\lib\site-packages\sqlalchemy_teradata\dialect.py", line 183, in
return [self._get_column_info(row) for row in res]

File "C:\Program Files\Anaconda3\lib\site-packages\sqlalchemy_teradata\dialect.py", line 153, in _get_column_info
fmt=row['columnformat'])

File "C:\Program Files\Anaconda3\lib\site-packages\sqlalchemy_teradata\dialect.py", line 129, in _resolve_type
prec = int(prec[prec.index('(') + 1: prec.index(')')])

ValueError: substring not found

I traced back and found the error in the following function

def _resolve_type(self, t, **kw):
    """
    Resolve types for String, Numeric, Date/Time, etc. columns
    """
    t = self.normalize_name(t)
    if t in ischema_names:
        t = ischema_names[t]

        if issubclass(t, sqltypes.String):
            return t(length=kw['length']/2 if kw['chartype']=='UNICODE' else kw['length'],\
                        charset=kw['chartype'])

        elif issubclass(t, sqltypes.Numeric):
            return t(precision=kw['prec'], scale=kw['scale'])

        elif issubclass(t, sqltypes.Time) or issubclass(t, sqltypes.DateTime):
            prec = kw['fmt']
            prec = int(prec[prec.index('(') + 1: prec.index(')')])
            return t(precision=prec)

        else:
            return t() # For types like Integer, ByteInt

    return None

I propose to solve this problem the function should be

def _resolve_type(self, t, **kw):
    """
    Resolve types for String, Numeric, Date/Time, etc. columns
    """
    t = self.normalize_name(t)
    if t in ischema_names:
        t = ischema_names[t]

        if issubclass(t, sqltypes.String):
            return t(length=kw['length']/2 if kw['chartype']=='UNICODE' else kw['length'],\
                        charset=kw['chartype'])

        elif issubclass(t, sqltypes.Numeric):
            return t(precision=kw['prec'], scale=kw['scale'])

        elif issubclass(t, sqltypes.Time) or issubclass(t, sqltypes.DateTime):
            prec = kw['fmt']
            try:
                prec = int(prec[prec.index('(') + 1: prec.index(')')])
            except:
                prec=0
            return t(precision=prec)

        else:
            return t() # For types like Integer, ByteInt

    return None

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions