Python mysqldb: можно ли вставить объект курсора без его анализа?

Мне нужно выполнять ежедневную загрузку из исходной базы данных в новую базу данных.

Новые столбцы таблицы db идентичны структуре оператора select исходной таблицы. Новая таблица db находится в отдельной db, поэтому объект курсора уникален для каждого соединения db, и я не могу просто выполнить запрос select into.

Так, например, если я выбираю какую-то таблицу в некоторой исходной базе данных:

# Assuming we already connected to the db and have a cursor object... 
sql_query = "SELECT val_bin, val_id, val_sel from table"
cursor.execute(sql_query)

Теперь у меня есть объекты, которые мне нужны в объекте cursor из выбора.

Затем, чтобы вставить, обычно я просто беру каждое значение и выполняю оператор вставки для каждого. Например:

for row in cursor.fetchall():
    insert_query = "insert into new_table (val_bin, val_id, val_sel) VAULES (%s, %d, %s) % row[0], row[1], row[2]"
    destination_cursor.execute(insert_query)
    destination_db.commit()

Однако это кажется утомительным и медленным, чтобы перебирать все подряд. Есть ли способ просто вставить весь возвращенный объект курсора из оператора select в новую таблицу db? Схема целевой таблицы точно совпадает с тем, что было возвращено при выборе.

Если это невозможно, ничего страшного, я просто пытаюсь сделать это проще и эффективнее.

Вы пробовали insert_query = "insert into new_table (val_bin, val_id, val_sel) VAULES (%s, %s, %s)"; destination_cursor.executemany(insert_query, cursor); destination_db.commit()?

Abdou 13.09.2018 21:12
0
1
87
1

Ответы 1

Вы можете использовать .executemany вместо .execute, если цель - вставить все результаты из данного курсора в таблицу. Ниже приводится иллюстрация:

cursor = connection.cursor()
destination_cursor = connection.cursor()
sql_query = "SELECT val_bin, val_id, val_sel from table"
cursor.execute(sql_query)
insert_query = "insert into new_table (val_bin, val_id, val_sel) VALUES (%s, %s, %s)"
destination_cursor.executemany(insert_query, cursor)
destination_db.commit()

Надеюсь, это окажется полезным.

Другие вопросы по теме