Как сделать select и сразу insert в другую таблицу , другой базы python
подскажите, как мне из запроса select что я сделал, к разным базам , вставить в мою новую базу в таблицу krd? При этом, хочу , что бы то что уже было вставлено до этого, не вставлялось заново, а просто обновлялись изменения в полях. Ниже , код не работает на вставку, может кто объяснить, как это реализовать
db = pymysql.connect(host="localhost", user="root", password="password")
cursor = db.cursor()
sql = "SELECT `nova`.`instances`.`created_at` ," \
"`nova`.`instances`.`updated_at` , " \
"`keystone`.`nonlocal_user`.`name` , " \
"`keystone`.`project`.`name` ," \
"`nova`.`instances`.`power_state` ," \
"`nova`.`instances`.`vm_state` ," \
"substring(replace(`keystone`.`user`.`extra`, '\"}','') , '12') , " \
"`nova`.`instances`.`host`, " \
"`nova`.`instances`.`display_name`," \
"`nova`.`instances`.`uuid`" \
"FROM `nova`.`instances` " \
"JOIN `keystone`.`nonlocal_user` on `nova`.`instances`.`user_id` = `keystone`.`nonlocal_user`.`user_id`" \
"JOIN `keystone`.`user` on `nova`.`instances`.`user_id` = `keystone`.`user`.`id`" \
"JOIN `keystone`.`project` on `nova`.`instances`.`project_id` = `keystone`.`project`.`id`" \
"WHERE DATEDIFF(NOW(),`nova`.`instances`.`created_at`) > 365 AND `nova`.`instances`.`vm_state` = `deleted`"
cursor.execute(sql)
results = cursor.fetchall()
for row in results:
created_at, updated_at, nonlocal_user, project,power_state,extra,host,display_name = row
cursor_table2.execute("INSERT INTO `vmremove.krd` VALUES (%s,%s,%s,%s,'%s'%s,%s,%s)" % (created_at, updated_at, nonlocal_user, project, power_state,extra, host, display_name ))
Ответы (1 шт):
Возможная реализация.
Этап 1: данные на сервере-источнике форматируются в вид, удобный для загрузки на целевом сервере, и записываются в текстовый CSV-файл запросом SELECT ... INTO Statement:
SELECT {список вывода, поля/выражения}
FROM {список таблиц-источников}
INTO OUTFILE {полный путь к CSV-файлу выгрузки}
{опции выгрузки}
Если таблицы вообще имеют одинаковую структуру, и преобразование не требуется, так и вовсе
TABLE {таблица-источник}
INTO OUTFILE {полный путь к CSV-файлу выгрузки}
{опции выгрузки}
Запрос выполняется либо управляющей программой, либо заданием Event Scheduler.
Этап 2: Файл перемещается с сервера-источника на сервер-приёмник.
Используется управляющая программа либо задание штатного либо стороннего планировщика ОС (cron, например), протокол передачи определяется возможностями систем (файловый доступ, FTP и т.п).
Если каталог выгрузки доступен с сервера-приёмника, этап не требуется.
Этап 3: Данные на сервере-приёмнике загружаются в таблицу (с обновлением существующих записей).
Вариант 1: сначала данные загружаются во временную таблицу (с использованием LOAD DATA INFILE), затем обновляются запросом INSERT ... ON DUPLICATE KEY UPDATE либо REPLACE INTO.
Вариант 2: сразу выполняется обновление одним из вышеуказанных запросов, данные получаются непосредственно из CSV-файла с использованием CSV Storage Engine.
Запрос выполняется либо управляющей программой, либо заданием Event Scheduler.