Как последовательно получить python_type из SQLAlchemy для нестандартных типов? - PullRequest
2 голосов
/ 16 апреля 2020

Я пытаюсь создать функцию для записи слова Python в виде строки в таблицу Postgres через язык выражений SQLAlchemy. Я хочу проверить, что значения, переданные в этом словаре, соответствуют типам столбцов таблицы базы данных.

Пока у меня есть что-то вроде

import sqlalchemy
from sqlalchemy import MetaData

def create(table, new_row):
    engine = sqlalchemy.create_engine(~my db address~) 
    config_metadata = MetaData()
    config_metadata.reflect(engine)
    target_table = config_metadata.tables[table]
    target_column_types = {col.name:col.type.python_type for col in target_table.c}
    # ... Code to check that target_column_types match types of new_row

Согласно документам python_type дает соответствующие типы, которые, как ожидается, будут возвращены, например, int для Integer и dict для JSONB. Однако, если я вызову его в столбце INT4RANGE Postgres, я получу NotImplementedError(). Эмпирически, я могу использовать SQLAlchemy для запроса этого же столбца диапазона и получить результат обратно, который имеет тип psycopg2._range.NumericRange

Почему .python_type вызов этого столбца просто не дает мне psycopg2._range.NumericRange, тогда ? И могу ли я что-нибудь сделать для получения заданного типа ожидаемого возврата в случаях, когда python_type не реализован?

...