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

Если вам нужно выполнить эту операцию слияния только один раз (для создания новой более крупной базы данных), вы можете создать сценарий / программу, которая будет зацикливать все ваши базы данных sqlite, а затем вставлять данные в вашу основную (большую) базу данных.
Это будет происходить по запросу, возможно несколько раз в день. Я бы видел, как это работает, как в http://sqlite.1065341.n5.nabble.com/Attempting-to-merge-large-databases-td39548.html, где базы данных объединяются в большую БД, выполняется запрос, а затем большая база данных удаляется.
Без обид, как один разработчик другому, я боюсь, что ваша идея покажется ужасно неэффективной. Мне кажется, что вместо объединения баз данных SQLite вам, вероятно, следует хранить несколько таблиц в одном файле базы данных.
Однако, если я ошибаюсь, я предполагаю, что вы можете ПРИСОЕДИНЯТЬ базы данных, а затем использовать ВИД, чтобы упростить ваши запросы. Или создайте таблицу в памяти и скопируйте все данные (но это еще хуже с точки зрения производительности, особенно если у вас большие базы данных)
Объединение двух баз данных полезно, когда инженер по базам данных работает с другой копией, чтобы изменить структуру или контент определенным образом, а тем временем пользователи изменяют более старую действующую версию.
Я ценю такой отзыв, но он больше подходит для комментария к исходному вопросу, чем для «ответа».
Подводя итог из Nabble пост в ответе DavidM:
attach 'c:\test\b.db3' as toMerge;
BEGIN;
insert into AuditRecords select * from toMerge.AuditRecords;
COMMIT;
detach toMerge;
При необходимости повторите.
Примечание: добавлен detach toMerge; в соответствии с комментарием микрофона.
а также фиксация detach toMerge;после.
Полагаю, это объединит только одну таблицу. Как бы вы импортируете сразу несколько таблиц, сохраняя их внешний ключ?
Я пробовал это, но столбцы из прикрепленной базы данных по какой-то причине были смещены, и результат был неправильным. Поэтому мне пришлось явно указать имена столбцов в том же порядке в операторах INSERT и SELECT.
Как справиться с ограничением UNIQUE и обновить строки с одинаковыми конкретными столбцами?
как это сделать в сценарии для динамического количества баз данных?
@ user5359531 Я бы написал что-нибудь на другом языке (например, python), чтобы выдавать команды SQL, чтобы сделать это, как указано выше, получить SQL, запустить SQL.
@Mithril Чтобы избежать ошибки «Ошибка: ограничение UNIQUE: xxx.id», замените оператор вставки на «вставить в AuditRecords (столбец1, столбец2, .. столбецN) выберите столбец1, столбец2, .. столбецN из toMerge.AuditRecords;»
Хотя это очень старая тема, это все еще актуальный вопрос для сегодняшних потребностей программирования. Я публикую это здесь, потому что ни один из предоставленных ответов не является кратким, простым и однозначным. Это ради гуглеров, которые попадают на эту страницу. GUI мы идем:
Ctrl + O.Copy, а затем перейдите к целевой базе данных в списке загруженных файлов базы данных (или создайте новую, если требуется) и щелкните правой кнопкой мыши целевую базу данных и щелкните на PasteЯ был поражен, осознав, что такую непростую задачу можно решить с помощью древнего навыка программирования под названием: копировать и вставлять :)
Я просто попробовал, и он говорит, что объект уже существует, и ввести новое уникальное имя?
не лучшее решение для сотен файлов ... поэтому мы используем навыки программирования!
@GuillermoOlmedo Суть моего ответа была очень ясной, то есть GUI мы идем. Я намеренно включил эту фразу. Обратите внимание на это.
Поздний ответ, но вы можете использовать:
#!/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 окнах и попробуйте объединить их, просто добавив таблицы перетащить и отпустить из одной в другую. Но проблема в том, что вы можете просто перетаскивать только таблицу один за раз, и поэтому на самом деле это не совсем решение для этого ответа, но все же его можно использовать для экономии времени от дальнейших поисков, если ваша база данных мала.
у вас есть пример кода, который будет выполнять это действие?