Ошибка при импорте DataFrame в таблицу MySQL

Я пробую создать таблицу в БД MySQL из своего DataFrame, который в свою очередь образуется с CSV файла. Для импорта в БД использую функцию .to_sql. По умолчанию она создаёт в таблице не подходящий мне тип данных.

Поэтому я написал две функции, которые подбирают нужные мне типы данных. Но при выполнении кода выдает ошибку:

sqlalchemy.exc.DataError: (pymysql.err.DataError) (1264, "Out of range value for column 'UGsmRelation' at row 1")

def ColLenMax(name):
    ColLenMax_set = set()
    df[name].map(lambda x: ColLenMax_set.add(len(str(x))))
    length_type = max(ColLenMax_set)
    return length_type

def mapping_df_types(df): # Функция для подбора нужных типов данных в SQL
    dtypedict = {}
    for i, j, w in zip(df.columns, df.dtypes, df):
        w_length = ColLenMax(w)
        if "object" in str(j):
            dtypedict.update({i: sqlalchemy.types.NVARCHAR(length=w_length)})
        if "float" in str(j):
            dtypedict.update({i: sqlalchemy.types.Float(precision=2, asdecimal=True)})
        if "int" in str(j):
            dtypedict.update({i: sqlalchemy.types.Integer()})
    return dtypedict

df = pd.read_csv('C:/Python/UGsmRelation.csv', sep=',', encoding="ISO-8859-1")

dtypedict = mapping_df_types(df)
df.to_sql('TST_read', con=connSQLBD_vf_work, schema='BSS', if_exists='replace', dtype=dtypedict, index=False)

введите сюда описание изображения


Ответы (1 шт):

Автор решения: MaxU

Обычно данная ошибка указывает на попытку записать в ячейку значение, которое выпадает за допустимые пределы. Например если столбец UGsmRelation имеет тип данных INT, то допустимый диапазон значений: [-2147483648, 2147483647]. Судя по скриншоту вы пытаетесь записать туда значение 5258207901 - это "вываливается" из допустимого диапазона значений.

В качестве решения можно изменить тип столбца на BIGINT (диапазон допустимых значений: [-9223372036854775808, 9223372036854775807]) или использовать строки - VARCHAR(30). В SqlAlchemy также существует тип данных BigInteger.

PS вы не указали в вопросе тип данных столбца UGsmRelation, поэтому данный ответ основан на предположениях...

→ Ссылка