Вставить игнорировать панды 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 
Другие вопросы по тегам