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

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

Я знаю, что для этого можно использовать ПРИКРЕПЛЯТЬ, но у него есть предел из 32 и 64 баз данных в зависимости от системы памяти на машине.

ReactJs | Supabase | Добавление данных в базу данных
ReactJs | Supabase | Добавление данных в базу данных
Это и есть ваш редактор таблиц в supabase.👇
75
0
79 368
7
Перейти к ответу Данный вопрос помечен как решенный

Ответы 7

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

у вас есть пример кода, который будет выполнять это действие?

user5359531 26.05.2018 00:20
Ответ принят как подходящий

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

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

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

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

Beejor 12.09.2015 23:59

Я ценю такой отзыв, но он больше подходит для комментария к исходному вопросу, чем для «ответа».

Elle Fie 29.06.2020 01:59

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

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

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

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

а также фиксация detach toMerge;после.

mike 13.04.2015 14:30

Полагаю, это объединит только одну таблицу. Как бы вы импортируете сразу несколько таблиц, сохраняя их внешний ключ?

ILoveCoding 29.05.2015 17:50

Я пробовал это, но столбцы из прикрепленной базы данных по какой-то причине были смещены, и результат был неправильным. Поэтому мне пришлось явно указать имена столбцов в том же порядке в операторах INSERT и SELECT.

Pimin Konstantin Kefaloukos 08.08.2016 05:36

Как справиться с ограничением UNIQUE и обновить строки с одинаковыми конкретными столбцами?

Mithril 14.09.2016 04:55

как это сделать в сценарии для динамического количества баз данных?

user5359531 26.05.2018 00:23

@ user5359531 Я бы написал что-нибудь на другом языке (например, python), чтобы выдавать команды SQL, чтобы сделать это, как указано выше, получить SQL, запустить SQL.

dfrankow 26.05.2018 02:22

@Mithril Чтобы избежать ошибки «Ошибка: ограничение UNIQUE: xxx.id», замените оператор вставки на «вставить в AuditRecords (столбец1, столбец2, .. столбецN) выберите столбец1, столбец2, .. столбецN из toMerge.AuditRecords;»

user553965 19.10.2020 16:58

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

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

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

Я просто попробовал, и он говорит, что объект уже существует, и ввести новое уникальное имя?

J. Scott Elblein 17.04.2019 19:45

не лучшее решение для сотен файлов ... поэтому мы используем навыки программирования!

Guillermo Olmedo 13.09.2019 22:45

@GuillermoOlmedo Суть моего ответа была очень ясной, то есть GUI мы идем. Я намеренно включил эту фразу. Обратите внимание на это.

Damilola Olowookere 15.09.2019 04:46

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

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

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

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

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