'How to get the vendor type for a SQLAlchemy generic type without creating a table?

Using the code shown below I can obtain the vendor type that corresponds to the SQLAlchemy generic type. In this case it is "VARCHAR(10)". How can I get the vendor type without creating a table?

engine = create_engine(DB_URL)
metadata_obj = MetaData()
table = Table('Table', metadata_obj,
    Column('Column', types.String(10))
)
metadata_obj.create_all(bind=engine)
metadata_obj = MetaData()
metadata_obj.reflect(bind=engine)
print(metadata_obj.tables['Table'].columns[0].type)


Solution 1:[1]

You can't obtain the type directly, but you could use a mock_engine to generate the DDL as a string which can be parsed. A mock_engine must be coupled with a callable that will process the SQL expression object that it generates.

This snippet is based on the example code from the SQLAlchemy docs.

import sqlalchemy as sa

tbl = sa.Table('drop_me', sa.MetaData(), sa.Column('col', sa.String(10)))

def dump(sql, *multiparams, **params):
    print(sql.compile(dialect=engine.dialect))

mock_engine = sa.create_mock_engine('postgresql://', executor=dump)
tbl.create(mock_engine)

Outputs


CREATE TABLE "Table" (
        "Column" VARCHAR(10)
)


sqlalchemy.schema.CreateTable, could also be used, but binding it to an engine is deprecated, to be removed in SQLAlchemy 2.0.

from sqlalchemy.schema import CreateTable

print(CreateTable(tbl, bind=some_engine)

Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source
Solution 1 snakecharmerb