Python - Массовое выделение, затем вставка из одной БД в другую. - PullRequest
4 голосов
/ 21 ноября 2011

Я ищу некоторую помощь о том, как сделать это в Python, используя sqlite3

В основном у меня есть процесс, который загружает БД (временную) и затем должен вставить свои записи во 2-ю идентичную БД (основную БД) .. и в то же время игнорировать / обойти любые возможные ошибки дублирующихся ключей

Я думал о двух сценариях, но не уверен, как лучше всего это сделать в Python

Вариант 1:

  • создать 2 соединения и объекты курсора, по 1 на каждую БД
  • выберите из DB 1, например:

    dbcur.executemany('SELECT * from table1')
    rows = dbcur.fetchall()
    
  • вставить их в БД 2:

    dbcur.execute('INSERT INTO table1 VALUES (:column1, :column2)', rows)
    dbcon.commit()
    

Это, конечно, не работает, так как я не уверен, как это сделать правильно:)

Вариант 2 (который я бы предпочел, но не уверен, как это сделать):

  • SELECT и INSERT в 1 утверждении

Кроме того, у меня есть 4 таблицы в БД, каждая с разными столбцами. Могу ли я пропустить присвоение имен столбцам в операторе INSERT?

Что касается дубликатов ключей, я прочитал, что могу использовать «ON DUPLICATE KEY» для обработки например.

INSERT INTO table1 VALUES (:column1, :column2) ON DUPLICATE KEY UPDATE set column1=column1

Ответы [ 2 ]

6 голосов
/ 21 ноября 2011

Вы можете ATTACH две базы данных к одному соединению с кодом, подобным этому:

import sqlite3
connection = sqlite3.connect('/path/to/temp.sqlite')
cursor=connection.cursor()
cursor.execute('ATTACH "/path/to/main.sqlite" AS master')

В sqlite нет синтаксиса ON DUPLICATE KEY, как в MySQL. Этот вопрос SO содержит альтернативы.

Таким образом, чтобы выполнить массовую вставку в одном SQL-выражении, вы можете использовать что-то вроде

cursor.execute('INSERT OR REPLACE INTO master.table1 SELECT * FROM table1')

См. на этой странице для получения информации о REPLACE и других параметрах ON CONFLICT.

0 голосов
/ 21 ноября 2011

Код для варианта 1 выглядит правильно.

Если вам нужна фильтрация для обхода дубликатов ключей, вставьте их во временную таблицу, а затем используйте команды SQL для удаления дубликатов и объединения их в целевую таблицу.

...