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

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

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


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


Ответы (7)


arrow_upward
90
arrow_downward

Подводя итог из 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

arrow_upward
19
arrow_downward

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

person davidmytton    schedule 17.09.2008

arrow_upward
9
arrow_downward

Хотя это очень старая тема, это все еще актуальный вопрос для сегодняшних потребностей программирования. Я публикую это здесь, потому что ни один из предоставленных ответов не является кратким, простым и однозначным. Это ради гуглеров, которые попадают на эту страницу. 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

arrow_upward
1
arrow_downward

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

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

arrow_upward
1
arrow_downward

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

#!/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

arrow_upward
0
arrow_downward

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

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

person Taba    schedule 29.06.2020

arrow_upward
-8
arrow_downward

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

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

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