![]() |
Datenbank: SQLite • Version: 3 • Zugriff über: Lokal
Sync/Abgleich zweier SQLite Datenbanken - ATTACH, JOIN, etc
Hallo!
Auf zwei unterschiedlichen Rechner läuft ein Programm, das zur Verwaltung seiner Daten eine eigene, lokale SQLite Datenbank verwendet. Die beiden Datenbanken von den Rechner A und B haben also die gleiche Struktur, jedoch (teilweise) unterschiedliche Daten. Ich suche nun nach einer Möglichkeit die beiden Datenbanken zu synchronisieren. Es genügt zunächst einmal der einfacherer Fall der Synchronisation in eine Richtung, es sollen also die Daten von Datenbank B in A eingefügt werden. Natürlich ist es kein Problem die alle Einträge einer Tabelle in DB A zu durchlaufen und mit allen Einträgen in der gleichen Tabelle in DB zu vergleichen. Das Ganze sollte aber etwas effizienter ablaufen. All Tabellen sind nach dem gleichen Muster aufgebaut und haben neben einer ID als Primärschlüssel auch eine GUID die einen Eintrag eindeutig identifiziert. Zudem hat jeder Eintrag eine "Version". Das ist einfach eine zufällige Zeichenfolge, die beim Erstellen eines Eintrags und bei jeder Änderung verändert wird. Beispiel:
Code:
Tabelle "Person"
ID GUID Name Adresse GruppenGUID Version Tabelle "Gruppe" ID GUID Name Version
Code:
Datenbank A
Tabelle "Person" 1 AAA Meyer G1 xyz 2 BBB Müller G1 abc Tabelle "Gruppe" 1 G1 Gruppe1 def 2 G1 Gruppe2 dge Datenbank B Tabelle "Person" 1 HHH Hinz G1 ghu 2 BBB Müller G2 vfh 3 AAA Meyer G1 xyz Tabelle "Gruppe" 1 G1 Gruppe1 def 2 G1 Gruppe2 dge 2 G3 Gruppe3 ttz Nun sollen die Daten von B nach A übertragen werden. Hierbei gilt:
Soviel zur Theorie. In der Praxis fehlt mir etwas Know-How um möglichst viel Arbeit von SQL erledigen zu lassen. Beide Datenbank Dateien werden auf den gleichen Rechner kopiert, eine Verbindung zu DB A aufgebaut und die Datenbank B per ATTACH an diese Verbindung angehängt. Fragen: 1. Mit welchem SQL Befehl wähle ich alle Einträge in Tabelle "datenbankB.Person" aus, die nicht in Tabelle "Person" enthalten sind? Kann das Ergebnis dieser Abfrage direkt per SQL in "Person" eingefügt werden oder muss das Ergebis Eintrag für Eintrag durchlaufen werden um diese dann einzeln per INSERT einzufügen? 2. Mit welchem SQL Befehl wähle ich alle Einträge in Tabele "datenbankB.Person" aus, die auch in Tabelle "Person" enthalten sind aber dort eine andere Version haben? Kann das Ergebnis dieser Abfrage direkt per SQL in "Person" eingefügt werden oder muss das Ergebis Eintrag für Eintrag durchlaufen werden um diese dann einzeln per INSERT einzufügen? Vielen Dank! |
AW: Sync/Abgleich zweier SQLite Datenbanken - ATTACH, JOIN, etc
Hallo,
Für meine beiden Fragen konnte ich mir mittlerweile folgende beide Abfragen erarbeiten:
Code:
Das klappt soweit ganz gut, es werden die richtigen Ergebnisse geliefert. Nun kann ich die Ergebnisse natürlich Zeile für Zeile durchlaufen und einzeln in INSERTs oder UPDATEs stecken. Schöner wäre es natürlich die Ergebnisse direkt in SQL weiter verwenden zu können. Hierzu habe ich folgendes Beispiel gefunden:
SELECT * FROM SyncDB.Table1 WHERE SyncDB.Table1.GUID NOT IN (SELECT GUID FROM Table1)
SELECT * FROM SyncDB.Table1 JOIN Table1 ON SyncDB.Table1.GUID = Table1.GUID WHERE SyncDB.Table1.VersionKey != Table1.VersionKey
Code:
Das sieht sehr vielversprechend aus und wäre genau was ich suche, funktioniert aber leider nicht. Hier meldet mir SQLite einen Syntax Fehler beim FROM. Weiß jemand ob diese Art der Abfrage bei SQLite generell nicht möglich ist, oder ob ich hier einen Fehler mache?
UPDATE
Table1 SET col1 = SyncDB.Table1.col1, col2 = SyncDB.Table1.col2 FROM Table1 INNER JOIN SyncDB.Table1 ON Table1.GUID = SyncDB.Table1.GUID Damit das Ganze wirklich perfekt wäre, müsste man die Abfrage natürlich noch um einen Test der Versionen ergänzen. Zudem muss die Abfrage in dieser Form für jede Tabelle speziell mit den jeweiligen Spaltennamen erstellt werden. Gibt es auch ein Update der Form:
Code:
UPDATE
Table1 SET "Alle Spalten in Table1 außer der ID-Spalte" = "Jeweilige Spalte aus Tabelle SyncDB.Table1" FROM/WHERE ... |
AW: Sync/Abgleich zweier SQLite Datenbanken - ATTACH, JOIN, etc
Die Syntax für ein Update mittels extra selektierter Daten ist glaub ich:
Code:
Ich weiß aber nicht, ob es so in sqLite geht.
Update <myTable>
(<myField2update1, ....myField2updateN) ( select myFieldOrValue1, .... myFieldOrValue from <myTabList> <mySelectWhereClause> ) [myUpdateWhereClause] |
Alle Zeitangaben in WEZ +1. Es ist jetzt 02:38 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz