Ошибка при импорте 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 шт):
Обычно данная ошибка указывает на попытку записать в ячейку значение, которое выпадает за допустимые пределы. Например если столбец UGsmRelation имеет тип данных INT, то допустимый диапазон значений: [-2147483648, 2147483647]. Судя по скриншоту вы пытаетесь записать туда значение 5258207901 - это "вываливается" из допустимого диапазона значений.
В качестве решения можно изменить тип столбца на BIGINT (диапазон допустимых значений: [-9223372036854775808, 9223372036854775807]) или использовать строки - VARCHAR(30). В SqlAlchemy также существует тип данных BigInteger.
PS вы не указали в вопросе тип данных столбца UGsmRelation, поэтому данный ответ основан на предположениях...
