Как я могу объединить множество баз данных SQLite?
Автор вопроса: davidmyttonОтветов: 7
Если у меня есть большое количество баз данных SQLite с одинаковой схемой, как лучше всего объединить их вместе, чтобы выполнить запрос по всем базам данных?
Я знаю, что для этого можно использовать ATTACH, но у него есть ограничение в 32 или 64 базы данных в зависимости от системы памяти на машине.
attach 'c:\test\b.db3' as toMerge;
BEGIN;
insert into AuditRecords select * from toMerge.AuditRecords;
COMMIT;
detach toMerge;
При необходимости повторите.
Примечание: добавлено detach toMerge; в соответствии с комментарием Майка.
Ответ 2 · рейтинг 19 · davidmytton
Это будет происходить по запросу, возможно несколько раз в день. Я бы увидел, как это работает, как в http://sqlite.1065341.n5.nabble.com/Attempting-to-merge-large-databases-td39548.html, где базы данных объединяются в большую БД, выполняется запрос, а затем большая база данных удаляется.
Ответ 3 · рейтинг 9 · Damilola Olowookere
Хотя это очень старая тема, это все еще актуальный вопрос для сегодняшних потребностей программирования. Я публикую это здесь, потому что ни один из предоставленных ответов не является кратким, простым и однозначным. Это ради гуглеров, которые попадают на эту страницу. GUI мы идем:
Загрузите Sqlitestudio.
Добавьте все файлы базы данных с помощью сочетания клавиш Ctrl + O.
Дважды щелкните каждый загруженный файл базы данных, чтобы открыть / активировать / развернуть их все.
Забавная часть: просто щелкните правой кнопкой мыши каждую из таблиц и выберите Copy, а затем перейдите к целевой базе данных в списке загруженных файлов базы данных (или создайте новую, если требуется) и щелкните правой кнопкой мыши целевую базу данных и щелкните на Paste
Я был поражен, осознав, что такую непростую задачу можно решить, используя древний навык программирования под названием: копирование и вставка :)
Ответ 4 · рейтинг 1 · Espo
Если вам нужно выполнить эту операцию слияния только один раз (для создания новой более крупной базы данных), вы можете создать сценарий / программу, которая будет зацикливать все ваши базы данных sqlite, а затем вставлять данные в вашу основную (большую) базу данных.
Ответ 5 · рейтинг 1 · Pedro Lobito
Поздний ответ, но вы можете использовать:
#!/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()
Если вы достигли конца этого канала, но все же не нашли свое решение, вот также способ объединить таблицы из 2 или более баз данных sqlite.
Сначала попробуйте загрузить и установить браузер БД для базы данных sqlite. Затем попробуйте открыть свои базы данных в двух окнах и попробуйте объединить их, просто перетащив таблицы из одной в другую. Но проблема в том, что вы можете просто перетаскивать только одну таблицу за раз, и поэтому это не совсем решение для этого ответа, но все же его можно использовать для экономии времени от дальнейших поисков, если ваша база данных маленький.
Ответ 7 · рейтинг -8 · Community
Без обид, как один разработчик другому, я боюсь, что ваша идея покажется ужасно неэффективной. Мне кажется, что вместо объединения баз данных SQLite вам, вероятно, следует хранить несколько таблиц в одном файле базы данных.
Однако, если я ошибаюсь, я предполагаю, что вы можете ПРИСОЕДИНЯТЬ базы данных, а затем использовать ВИД, чтобы упростить ваши запросы. Или создайте таблицу в памяти и скопируйте все данные (но это еще хуже с точки зрения производительности, особенно если у вас большие базы данных)