Как я могу объединить множество баз данных SQLite?

Если у меня есть большое количество баз данных SQLite с одинаковой схемой, как лучше всего объединить их вместе, чтобы выполнить запрос по всем базам данных?

Я знаю, что для этого можно использовать ATTACH, но у него есть ограничение в 32 или 64 базы данных в зависимости от системы памяти на машине.


person davidmytton    schedule 17.09.2008    source источник


Ответы (7)


Подводя итог из Nabble post в ответе DavidM:

attach 'c:\test\b.db3' as toMerge;           
BEGIN; 
insert into AuditRecords select * from toMerge.AuditRecords; 
COMMIT; 
detach toMerge;

При необходимости повторите.

Примечание: добавлено detach toMerge; в соответствии с комментарием Майка.

person Community    schedule 18.06.2012
comment
а также detach toMerge; после фиксации. - person mike; 13.04.2015
comment
Полагаю, это объединит только одну таблицу. Как бы вы импортируете сразу несколько таблиц, сохраняя их внешний ключ? - person ILoveCoding; 29.05.2015
comment
Я пробовал это, но столбцы из прикрепленной базы данных по какой-то причине смещены, и результат был неправильным. Поэтому мне пришлось явно указать имена столбцов в том же порядке в операторах INSERT и SELECT. - person Pimin Konstantin Kefaloukos; 08.08.2016
comment
Как справиться с ограничением UNIQUE и обновить строки с одинаковыми конкретными столбцами? - person Mithril; 14.09.2016
comment
как это сделать в сценарии для динамического количества баз данных? - person user5359531; 26.05.2018
comment
@ user5359531 Я бы написал что-нибудь на другом языке (например, python), чтобы выдавать команды SQL, чтобы сделать это, как указано выше, получить SQL, запустить SQL. - person dfrankow; 26.05.2018
comment
@Mithril Чтобы избежать ошибки: ограничение UNIQUE не выполнено: xxx.id, замените оператор вставки на вставку в AuditRecords (столбец1, столбец2, .. столбецN) выберите столбец1, столбец2, .. столбецN из toMerge.AuditRecords; - person user553965; 19.10.2020
comment
Чтобы выполнить это одновременно с несколькими таблицами, а также устранить причину проблем с ограничениями UNIQUE (т. Е. Дубликатов) - используйте операцию UNION: sqlitetutorial.net/sqlite-union (например, accach 'a.db' как a; прикрепить 'b.db' как b; BEGIN; вставить в таблицу select * from a .table UNION выберите * из b.table; COMMIT; - person ; 29.05.2021

Это будет происходить по запросу, возможно несколько раз в день. Я бы увидел, как это работает, как в http://sqlite.1065341.n5.nabble.com/Attempting-to-merge-large-databases-td39548.html, где базы данных объединяются в большую БД, выполняется запрос, а затем большая база данных удаляется.

person davidmytton    schedule 17.09.2008

Хотя это очень старая тема, это все еще актуальный вопрос для сегодняшних потребностей программирования. Я публикую это здесь, потому что ни один из предоставленных ответов не является кратким, простым и однозначным. Это ради гуглеров, которые попадают на эту страницу. GUI мы идем:

  1. Загрузите Sqlitestudio.
  2. Добавьте все файлы базы данных с помощью сочетания клавиш Ctrl + O.
  3. Дважды щелкните каждый загруженный файл базы данных, чтобы открыть / активировать / развернуть их все.
  4. Забавная часть: просто щелкните правой кнопкой мыши каждую из таблиц и выберите Copy, а затем перейдите к целевой базе данных в списке загруженных файлов базы данных (или создайте новую, если требуется) и щелкните правой кнопкой мыши целевую базу данных и щелкните на Paste

Я был поражен, осознав, что такую ​​непростую задачу можно решить, используя древний навык программирования под названием: копирование и вставка :)

person Damilola Olowookere    schedule 15.11.2018
comment
Я просто попробовал, и он говорит, что объект уже существует, и ввести новое уникальное имя? - person J. Scott Elblein; 17.04.2019
comment
не лучшее решение для сотен файлов ... поэтому мы используем навыки программирования! - person Guillermo Olmedo; 13.09.2019
comment
@GuillermoOlmedo Суть моего ответа была очень ясной, т.е. GUI we go. Я намеренно включил эту фразу. Обратите внимание на это. - person Damilola Olowookere; 15.09.2019

Если вам нужно выполнить эту операцию слияния только один раз (для создания новой более крупной базы данных), вы можете создать сценарий / программу, которая будет зацикливать все ваши базы данных sqlite, а затем вставлять данные в вашу основную (большую) базу данных.

person Espo    schedule 17.09.2008
comment
у вас есть пример кода, который будет выполнять это действие? - person user5359531; 26.05.2018

Поздний ответ, но вы можете использовать:

#!/usr/bin/python

import sys, sqlite3

class sqlMerge(object):
    """Basic python script to merge data of 2 !!!IDENTICAL!!!! SQL tables"""

    def __init__(self, parent=None):
        super(sqlMerge, self).__init__()

        self.db_a = None
        self.db_b = None

    def loadTables(self, file_a, file_b):
        self.db_a = sqlite3.connect(file_a)
        self.db_b = sqlite3.connect(file_b)

        cursor_a = self.db_a.cursor()
        cursor_a.execute("SELECT name FROM sqlite_master WHERE type='table';")

        table_counter = 0
        print("SQL Tables available: \n===================================================\n")
        for table_item in cursor_a.fetchall():
            current_table = table_item[0]
            table_counter += 1
            print("-> " + current_table)
        print("\n===================================================\n")

        if table_counter == 1:
            table_to_merge = current_table
        else:
            table_to_merge = input("Table to Merge: ")

        return table_to_merge

    def merge(self, table_name):
        cursor_a = self.db_a.cursor()
        cursor_b = self.db_b.cursor()

        new_table_name = table_name + "_new"

        try:
            cursor_a.execute("CREATE TABLE IF NOT EXISTS " + new_table_name + " AS SELECT * FROM " + table_name)
            for row in cursor_b.execute("SELECT * FROM " + table_name):
                print(row)
                cursor_a.execute("INSERT INTO " + new_table_name + " VALUES" + str(row) +";")

            cursor_a.execute("DROP TABLE IF EXISTS " + table_name);
            cursor_a.execute("ALTER TABLE " + new_table_name + " RENAME TO " + table_name);
            self.db_a.commit()

            print("\n\nMerge Successful!\n")

        except sqlite3.OperationalError:
            print("ERROR!: Merge Failed")
            cursor_a.execute("DROP TABLE IF EXISTS " + new_table_name);

        finally:
            self.db_a.close()
            self.db_b.close()

        return

    def main(self):
        print("Please enter name of db file")
        file_name_a = input("File Name A:")
        file_name_b = input("File Name B:")

        table_name = self.loadTables(file_name_a, file_name_b)
        self.merge(table_name)

        return

if __name__ == '__main__':
    app = sqlMerge()
    app.main()

SRC: Инструмент для объединения идентичных баз данных SQLite3

person Pedro Lobito    schedule 22.05.2020
comment
Объединяет ли это две базы данных или отбрасывает все из подчиненного устройства и вставляет все из главной базы данных? Если это произойдет, простая копия файла сделает то же самое, но быстрее. Дело в том, чтобы объединить только отличия ... - person firephil; 07.05.2021

Если вы достигли конца этого канала, но все же не нашли свое решение, вот также способ объединить таблицы из 2 или более баз данных sqlite.

Сначала попробуйте загрузить и установить браузер БД для базы данных sqlite. Затем попробуйте открыть свои базы данных в двух окнах и попробуйте объединить их, просто перетащив таблицы из одной в другую. Но проблема в том, что вы можете просто перетаскивать только одну таблицу за раз, и поэтому это не совсем решение для этого ответа, но все же его можно использовать для экономии времени от дальнейших поисков, если ваша база данных маленький.

person Taba    schedule 29.06.2020

Без обид, как один разработчик другому, я боюсь, что ваша идея покажется ужасно неэффективной. Мне кажется, что вместо объединения баз данных SQLite вам, вероятно, следует хранить несколько таблиц в одном файле базы данных.

Однако, если я ошибаюсь, я предполагаю, что вы можете ПРИСОЕДИНЯТЬ базы данных, а затем использовать ВИД, чтобы упростить ваши запросы. Или создайте таблицу в памяти и скопируйте все данные (но это еще хуже с точки зрения производительности, особенно если у вас большие базы данных)

person Community    schedule 17.09.2008
comment
Объединение двух баз данных полезно, когда инженер по базам данных работает с другой копией, чтобы изменить структуру или контент определенным образом, а тем временем пользователи изменяют более старую действующую версию. - person Beejor; 12.09.2015
comment
Я ценю такой отзыв, но он больше подходит для комментария к исходному вопросу, чем для ответа. - person Elle Fie; 29.06.2020