Wie kann ich viele SQLite-Datenbanken zusammenführen?

73

Wenn ich eine große Anzahl von SQLite-Datenbanken mit demselben Schema habe, wie lassen sich diese am besten zusammenführen, um eine Abfrage für alle Datenbanken durchzuführen?

Ich weiß, dass es möglich ist, ATTACH zu verwenden, aber es gibt ein Limit von 32 und 64 Datenbanken, abhängig vom Speichersystem auf dem Computer.

Davidmytton
quelle

Antworten:

83

Um es aus dem Nabble-Beitrag in DavidMs Antwort zusammenzufassen:

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

Bei Bedarf wiederholen.

Hinweis: detach toMerge;gemäß Mikes Kommentar hinzugefügt .

dfrankow
quelle
6
und auch detach toMerge; nach dem Festschreiben.
Mike
2
Dies würde vermutlich nur eine Tabelle zusammenführen. Wie würden Sie mehrere Tabellen gleichzeitig importieren und dabei ihren Fremdschlüssel beibehalten?
ILoveCoding
Ich habe es versucht, aber die Spalten aus der angehängten Datenbank waren aus irgendeinem Grund falsch ausgerichtet und das Ergebnis war falsch. Daher musste ich die Spaltennamen in den Anweisungen INSERT und SELECT explizit in derselben Reihenfolge angeben.
Pimin Konstantin Kefaloukos
3
Wie gehe ich mit EINZIGARTIGEN Einschränkungen um und aktualisiere Zeilen mit denselben spezifischen Spalten?
Mithril
1
@ user5359531 Ich würde etwas in einer anderen Sprache (wie Python) schreiben, um die SQL-Befehle auszugeben, um dies wie oben zu tun, das SQL abzurufen, das SQL auszuführen.
dfrankow
5

Obwohl dies ein sehr alter Thread ist, ist dies immer noch eine relevante Frage in den heutigen Programmieranforderungen. Ich poste dies hier, weil noch keine der Antworten präzise, ​​einfach und direkt ist. Dies ist für Googler, die auf dieser Seite landen. GUI wir gehen:

  1. Laden Sie Sqlitestudio herunter
  2. Fügen Sie alle Ihre Datenbankdateien mithilfe der Ctrl + OTastenkombination hinzu
  3. Doppelklicken Sie auf jede jetzt geladene Datenbankdatei, um sie alle zu öffnen / aktivieren / erweitern
  4. Unterhaltsamer Teil: Klicken Sie einfach mit der rechten Maustaste auf jede der Tabellen und klicken Sie auf Copyund gehen Sie dann zur Zieldatenbank in der Liste der geladenen Datenbankdateien (oder erstellen Sie bei Bedarf eine neue). Klicken Sie mit der rechten Maustaste auf die Zieldatenbank und klicken Sie aufPaste

Ich war beeindruckt zu erkennen, dass solch eine entmutigende Aufgabe mit der alten Programmierfähigkeit namens Kopieren und Einfügen gelöst werden kann :)

Damilola Olowookere
quelle
1
Ich habe es gerade versucht und es heißt, das Objekt existiert bereits und um einen neuen eindeutigen Namen einzugeben?
J. Scott Elblein
1
Keine gute Lösung für Hunderte von Dateien ... deshalb nutzen wir die Programmierkenntnisse!
Guillermo Olmedo
2
@ GuillermoOlmedo Der Schwerpunkt meiner Antwort wurde sehr deutlich gemacht, dh GUI wir gehen . Ich habe diesen Satz absichtlich aufgenommen. Bitte beachte, dass.
Damilola Olowookere
1

Wenn Sie diesen Zusammenführungsvorgang nur einmal ausführen müssen (um eine neue größere Datenbank zu erstellen), können Sie ein Skript / Programm erstellen, das alle Ihre SQLite-Datenbanken schleift und die Daten dann in Ihre Hauptdatenbank (große Datenbank) einfügt.

Espo
quelle
3
Haben Sie ein Beispiel für den Code, der diese Aktion ausführen würde?
user5359531
0

Späte Antwort, aber Sie können verwenden:

#!/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: Tool zum Zusammenführen identischer SQLite3-Datenbanken

Pedro Lobito
quelle
0

Wenn Sie den unteren Rand dieses Feeds erreicht haben und Ihre Lösung noch nicht gefunden haben, können Sie hier auch die Tabellen von zwei oder mehr SQLite-Datenbanken zusammenführen.

Versuchen Sie zunächst, den DB-Browser für die SQLite-Datenbank herunterzuladen und zu installieren . Versuchen Sie dann, Ihre Datenbanken in zwei Fenstern zu öffnen und sie durch einfaches Ziehen und Ablegen von Tabellen zusammenzuführen. Das Problem ist jedoch, dass Sie jeweils nur eine Tabelle ziehen und ablegen können. Daher ist dies keine Lösung für diese Antwort, aber es kann verwendet werden, um Zeit bei weiteren Suchvorgängen zu sparen, wenn Ihre Datenbank klein ist.

Taba
quelle
-8

Ohne Beleidigung, genau wie ein Entwickler zum anderen, befürchte ich, dass Ihre Idee furchtbar ineffizient erscheint. Es scheint mir, dass Sie anstelle der Vereinigung von SQLite-Datenbanken wahrscheinlich mehrere Tabellen in derselben Datenbankdatei speichern sollten.

Wenn ich mich jedoch irre, könnten Sie die Datenbanken anhängen und dann eine ANSICHT verwenden, um Ihre Abfragen zu vereinfachen. Oder erstellen Sie eine In-Memory-Tabelle und kopieren Sie alle Daten (dies ist jedoch in Bezug auf die Leistung noch schlechter, insbesondere wenn Sie über große Datenbanken verfügen).

Robert Gould
quelle
1
Das Zusammenführen von zwei Datenbanken ist nützlich, wenn ein Datenbankingenieur mit einer anderen Kopie arbeitet, um die Struktur oder den Inhalt auf bestimmte Weise zu ändern. In der Zwischenzeit wird die ältere Live-Version von den Benutzern geändert.
Beejor
Ich freue mich über ein solches Feedback, aber dies wäre besser für einen Kommentar zur ursprünglichen Frage geeignet als für eine "Antwort".
Elle Fie