Вставить игнорировать панды dataframe в MySQL
Я хочу "вставить игнорировать" весь массив данных панд в MySQL. Есть ли способ сделать это без зацикливания строк?
В dataframe.to_sql я вижу только параметр if_exists 'append', но будет ли он продолжаться на дублирующих уникальных ключах?
2 ответа
Подумайте об использовании временной таблицы (с точной структурой финальной таблицы), которая всегда заменяется пандами, затем запустите INSERT IGNORE
в вызове курсора:
dataframe.to_sql('myTempTable', con, if_exists ='replace')
cur = con.cursor()
cur.execute("INSERT IGNORE INTO myFinalTable SELECT * FROM myTempTable")
con.commit()
Там нет никакого способа сделать это в пандах до текущей версии pandas (0.20.3)
,
Опция if_exists
применяется только к таблице (не к строкам), как указано в документации.
if_exists : {‘fail’, ‘replace’, ‘append’}, default ‘fail’
fail
: Если таблица существует, ничего не делать.
replace
: Если таблица существует, удалите ее, создайте заново и вставьте данные.
append
: Если таблица существует, вставьте данные. Создать, если не существует.
Через петлю
Это замедлит процесс, поскольку вы вставляете по одной строке за раз
for x in xrange(data_frame.shape[0]):
try:
data_frame.iloc[x:x+1].to_sql(con=sql_engine, name="table_name", if_exists='append')
except IntegrityError:
# Your code to handle duplicates
pass