Легко ли конвертировать между типами столбцов SQLAlchemy и типами данных Python? - PullRequest
4 голосов
/ 12 ноября 2010

Я ищу простой способ Python для сравнения типов столбцов из SQLAlchemy с базовыми типами.Например, если мой тип столбца VARCHAR любой длины, я хочу прочитать его как строку.

Я могу прочитать тип столбца, но я не уверен, что это простой способ проверить, является ли он основнымтипа ... было бы неплохо, если бы я мог использовать что-то вроде "если isinstance (mycolumn, int)" - но я новичок в Python и не уверен, как это будет работать.

Вот что у меня такfar:

from sqlalchemy import MetaData
from sqlalchemy import create_engine, Column, Table
engine = create_engine('mysql+mysqldb://user:pass@localhost:3306/mydb', pool_recycle=3600)
meta = MetaData()
meta.bind = engine
meta.reflect()
datatable = meta.tables['my_data_table']
[c.type for c in datatable.columns]

Output:

[INTEGER(display_width=11), DATE(), VARCHAR(length=127), DOUBLE(precision=None, scale=None, asdecimal=True)]

Моя конечная цель двоякая, во-первых, потому что я хочу отформатировать вывод на основе типа, когда я загружаю его в jQuery jqGrid.Во-вторых, я медленно преобразовываю ненормализованные таблицы данных в нормализованную структуру и хочу убедиться, что я сохраняю согласованность типов - (чтобы мои числа в предыдущей таблице сохранялись в виде чисел, а не строк ...)

Ответы [ 3 ]

6 голосов
/ 11 октября 2016

Просто используйте атрибут python_type, доступный во всех типах AQLAlchemy, например:

[c.type.python_type for c in datatable.columns]
4 голосов
/ 12 ноября 2010

Одним из решений является преобразование вручную - например, это работает:

def convert(self, saType):
    type = "Unknown"
    if isinstance(saType,sqlalchemy.types.INTEGER):
        type = "Integer"
    elif isinstance(saType,sqlalchemy.types.VARCHAR):
        type = "String"
    elif isinstance(saType,sqlalchemy.types.DATE):
        type = "Date"
    elif isinstance(saType,sqlalchemy.dialects.mysql.base._FloatType):
        type = "Double"
    return type

Не уверен, что это нормальный способ работы Python ... Я все еще думаю, как программист Java.

1 голос
/ 03 июля 2014

Вы можете сделать str (column.type), это даст вам тип в виде строки.В вашем коде

    from sqlalchemy import MetaData
    from sqlalchemy import create_engine, Column, Table
    engine = create_engine('mysql+mysqldb://user:pass@localhost:3306/mydb', pool_recycle=3600)
    meta = MetaData()
    meta.bind = engine
    meta.reflect()
    datatable = meta.tables['my_data_table']
    [str(c.type) for c in datatable.columns]

вы получите список с типами данных. Надеюсь, это поможет вам

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...