У меня есть скрипт для вставки DataFrame в таблицу с помощью executemany().
Проблема в том, что эта таблица имеет идентификатор Первичный ключ, и иногда может возникнуть необходимость вставить строку с таким же идентификатором.
Я хотел бы знать, есть ли простой способ обработать такое исключение и продолжить выполнение executemany().
Альтернативой, о которой я думал, является проверка всех Я БЫ DataFrame, которые находятся в таблице, и удаление их перед вставкой в базу данных... но я не знаю, будет ли это эффективным...
Мой код:
params = (tuple(row) for _, row in df.iterrows())
sql = '''INSERT INTO stilingue.stalker_comments values(?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)'''
start = time.time()
try:
self.cursor.executemany(sql, params)
self.conn.commit()
except Exception as e:
print(e)
self.conn.rollback()
print('Something went wrong...')
end = time.time()
print('Execution time: {0:.2f} seconds.'.format(end-start))
фрейм данных:
channel followers gender hashtags interactions likes location mentions name page_comment ... text themes uid user_image_url user_url username verified videoplays business rt_count
0 Inbox do Facebook 0 Não Definido 0 0 Midiam Mendes False ... Sacanagem isso né?? Poorq vocês dizeram que o ... 1995608377159933 https://storage.googleapis.com/usersstilingue/... False 0 Itaú 0
1 Inbox do Facebook 0 Não Definido 0 0 Midiam Mendes False ... Eu tenho provas , e posso processar vocês!! 1995608377159933 https://storage.googleapis.com/usersstilingue/... False 0 Itaú 0
2 Inbox do Facebook 0 Não Definido 0 0 Midiam Mendes False ... Isso é um absurdo 1995608377159933 https://storage.googleapis.com/usersstilingue/... False 0 Itaú 0
Проследить:
('23000', "[23000] [Microsoft][ODBC SQL Server Driver][SQL Server]Violation of PRIMARY KEY constraint 'PK__stalker___DD37D91A4691B0F7'. Cannot insert duplicate key in object 'stilingue.stalker_comments'. The duplicate key value is (m__g64-pbys7OlEvp8xmfyktlNIHrUPQPiNrcKrPVOF_Lj84OJfN4WtAJ92lj7YnzAOQ1B7EDCJf85k_UcwB0-4Q). (2627) (SQLExecDirectW); [23000] [Microsoft][ODBC SQL Server Driver][SQL Server]The statement has been terminated. (3621)")
покажи нам трассировку и фрейм данных
@StevenG я отредактировал пост. @ Горд Томпсон, как вы думаете, df.to_sql быстрее, чем executemany (), даже с fast_executemany = True?
@GordThompson Спасибо!






Если ваши данные невелики, самый простой способ — создать в базе данных временную таблицу, не имеющую PK. Затем вставьте данные в этот временный файл, удалите дублирование из временного (если у вас есть база данных SQL-сервера, вы можете использовать следующий синтаксис для удаления дублирования) и вставьте свои данные в основную таблицу.
WITH table_1 AS
(SELECT *,RN=ROW_NUMBER() OVER(PARTITION BY [pk_field]
order by date)
FROM [temporary_table])
DELETE FROM table_1 WHERE RN>1
Одной из альтернатив может быть использование
df.to_sqlдля загрузки строк во временную таблицу, а затем использование инструкции SQLMERGEдля вставки строк в основную таблицу.