Hallo zusammen,
ich habe zwei Raspberry Pi´s mit jeweils einer Datenbank drauf (sqlite Datenbank).
Ist es möglich die Tabellen aus der ersten Datenbank in die zweite hinzufügen ohne die alten Daten zu ersetzen?
Hatte das mit netcat prbiert, aber da werden meine Daten geben die neuen ersetzt.
Oder anders gefragt, kann ich prinzipell zwei sqlite Datenbanken mit einander verknüpfen?
Beispiel: DB 1) Messdaten Wetterstation 1 (Luftfeuchtigkeit) Tabelle
DB 2) Messdaten Wetterstation 2 (Temperatur) Tabelle
Die Messdaten der Tabelle 1 aus der ersten DB soll soll dann alle 5Minuten als Beispiel in die zweite DB angereit werden. Beim nächsten Export der DB 1 (also nach 5 Minuten) sollen wieder die Messwerte der Tabelle Luftfeuchtigkeit in die Datenbank 2 geschrieben werden, aber die alten Werte NICHT überschreiben.
Kann mir da evtl. jemand weiterhelfen???
Zwei SQlite Datenbanken verknüpfen
-
- User
- Beiträge: 29
- Registriert: Dienstag 20. Oktober 2015, 12:59
ich verstehe dein problem auf fachlicher ebene nicht ganz. vllt fehlen noch ein paar informationen.
was ich verstanden habe: du willst alle 5 minuten daten aus der einen datenbank in die andere rüberkopieren.
schreib dir doch ein script, welches alle 5 minuten getriggert wird und die daten der letzten 5 minuten aus datenbank 1/tabelle zieht. diese werden an eine api auf dem anderen raspberry gereicht und dort in die datenbank 2/tabelle geschrieben. dabei dürfte nichs überschrieben werden, wenn du einfache add-commands ausführst
was ich verstanden habe: du willst alle 5 minuten daten aus der einen datenbank in die andere rüberkopieren.
schreib dir doch ein script, welches alle 5 minuten getriggert wird und die daten der letzten 5 minuten aus datenbank 1/tabelle zieht. diese werden an eine api auf dem anderen raspberry gereicht und dort in die datenbank 2/tabelle geschrieben. dabei dürfte nichs überschrieben werden, wenn du einfache add-commands ausführst
- noisefloor
- User
- Beiträge: 4159
- Registriert: Mittwoch 17. Oktober 2007, 21:40
- Wohnort: WW
- Kontaktdaten:
Hallo,
Wenn ich dein Problem richtig verstehe, dann bräuchtest du ein DB mit Master-Master Replikation - AFAIK gibt es aber keine relationale DB, die das kann (jedenfalls keine, die man so zu Hause einsetzt). CouchDB kann das z.B., aber CouchDB ist dokumenten-orientiert und nicht relational.
Und in deinem Fall wäre es vielleicht auch einfacher, wenn du ein DB wie PostgreSQL oder MariaDB einsetzt, die Netzwerk-fähig ist. Ist SQLite nämlich nicht. Mit einer netzwerkfähig DB könntest du die Daten direkt von DB-Server zu DB-Server kopieren, ohne das du dir selber eine API / REST-interface oder so für SQLite schreiben müsstest.
Gruß, noisefloor
Ob du Daten ersetzt oder überschreibst hängt vom eingesetzten SQL-Befehl ab. `update` überschreibt, `insert` fügt die Daten hinzu.Ist es möglich die Tabellen aus der ersten Datenbank in die zweite hinzufügen ohne die alten Daten zu ersetzen?
Wenn ich dein Problem richtig verstehe, dann bräuchtest du ein DB mit Master-Master Replikation - AFAIK gibt es aber keine relationale DB, die das kann (jedenfalls keine, die man so zu Hause einsetzt). CouchDB kann das z.B., aber CouchDB ist dokumenten-orientiert und nicht relational.
Und in deinem Fall wäre es vielleicht auch einfacher, wenn du ein DB wie PostgreSQL oder MariaDB einsetzt, die Netzwerk-fähig ist. Ist SQLite nämlich nicht. Mit einer netzwerkfähig DB könntest du die Daten direkt von DB-Server zu DB-Server kopieren, ohne das du dir selber eine API / REST-interface oder so für SQLite schreiben müsstest.
Gruß, noisefloor
Ich finde das klingt nach falschem Tool fuer den Job. Statt muehselig eine Replikation nachzubauen, benutz doch gleich Postgres (*), und verbinde den einen PI mit der DB die auf dem anderen laeuft. Dann hast du gleich alles beisammen.
(*) darf auch eine MySQL sein. Ich mag die nicht so, aber wenn's schee macht...
(*) darf auch eine MySQL sein. Ich mag die nicht so, aber wenn's schee macht...
Vielen Dank für die Antworten.
Ich glaube, ich habe mich falsch ausgedrückt, Anfängerfehler.
Ich habe 2 RPI´s, auf dem einen ist eine Datenbank und auf dem anderen ist ebenfalls eine DB.
Jetzt möchte ich gerne übers Netzwerk meine erste Datenbank mit der zweiten verknüpfen, damit ich nur noch eine Hauptdatenbank habe, wo ich dann zB. mir die Daten als CSV exportieren kann.
Im SQlite manager als Firefox plugin kann man über die Importieren Funktion eine Datenbank zur bestehenden hinzufügen. Ich möchte das aber natürlich nicht händisch, sondern automatisch als Sktipt in Python machen.
Ziel: Die erste DB vom RPI1 wird übers Netzwerk alle 60s in die zweite DB auf dem RPi2 gesendet und verknüpt.
Alle 5 Minuten exporiere ich meine Daten aus der DB2 als CSV in irgendein Verzeichnis.
Geht so etwas?
Über netcat bekomme ich schonmal die erste DB auf den RPi2, aber da liegt die DB dann rum und kann nur händisch mit der zweiten verknüpft werden.
Ich würde mich sehr über eine Antwort freuen.
Ich glaube, ich habe mich falsch ausgedrückt, Anfängerfehler.
Ich habe 2 RPI´s, auf dem einen ist eine Datenbank und auf dem anderen ist ebenfalls eine DB.
Jetzt möchte ich gerne übers Netzwerk meine erste Datenbank mit der zweiten verknüpfen, damit ich nur noch eine Hauptdatenbank habe, wo ich dann zB. mir die Daten als CSV exportieren kann.
Im SQlite manager als Firefox plugin kann man über die Importieren Funktion eine Datenbank zur bestehenden hinzufügen. Ich möchte das aber natürlich nicht händisch, sondern automatisch als Sktipt in Python machen.
Ziel: Die erste DB vom RPI1 wird übers Netzwerk alle 60s in die zweite DB auf dem RPi2 gesendet und verknüpt.
Alle 5 Minuten exporiere ich meine Daten aus der DB2 als CSV in irgendein Verzeichnis.
Geht so etwas?
Über netcat bekomme ich schonmal die erste DB auf den RPi2, aber da liegt die DB dann rum und kann nur händisch mit der zweiten verknüpft werden.
Ich würde mich sehr über eine Antwort freuen.
@Peter Pan: Man will ja eigentlich nicht jedes mal die komplette Datenbank übermitteln sondern nur die neuen Werte die seit dem letzten mal angefallen sind. Du müsstest Dir halt ein Programm schreiben das genau das macht was Du möchtest. Wobei ich mir die Notwendigkeit der zweiten DB überlegen würde, denn wenn man sowieso schon eine API über's Netz bereitstellen muss um in eine Datenbank Werte einzutragen könnte man die vielleicht auch direkt darüber eintragen statt sie erst/zusätzlich lokal zu sammeln. Kommt aber auf den Anwendungsfall an.
Ich würde wahrscheinlich eine REST-API auf dem Rechner wo die Daten zusammengeführt werden implementieren, mit Bottle oder Flask als Mikrowebrahmenwerk.
Ich würde wahrscheinlich eine REST-API auf dem Rechner wo die Daten zusammengeführt werden implementieren, mit Bottle oder Flask als Mikrowebrahmenwerk.
@Peter Pan: Das was Du möchtest geht grundsätzlich, man muss es halt programmieren. Also wirklich ”ausprogrammieren”, das sind nicht zwei oder drei Zeilen sondern man muss auf beiden Seiten ein Programm schreiben und die über irgendeine Technik miteinander verbinden.
- noisefloor
- User
- Beiträge: 4159
- Registriert: Mittwoch 17. Oktober 2007, 21:40
- Wohnort: WW
- Kontaktdaten:
Hallo,
_schreibt_ der 2. Raspi auch in die DB? Oder soll da "nur" eine Kopie der DB des 1. Raspi liegen?
Gruß, noisefloor
_schreibt_ der 2. Raspi auch in die DB? Oder soll da "nur" eine Kopie der DB des 1. Raspi liegen?
Gruß, noisefloor
Hallo zusammen und danke schonmal für die Antworten,
mein Problem ist, dass ich zwei RPi´s habe die mit einem Dlink Router übers Netzwerk verbunden sind.
An jedem RPi ist ein GPIO Adapter verbaut, sodass ich jeweils 17 GPIO´s pro RPi zur Verfügung habe.
Ich habe 27 Signale die ich auswerten möchte, sodass ich ja mit einem RPi nicht auskommen würde. Deshalb auch die zwei RPi´s.
Jetzt möchte ich gerne alle 29 Signale in nur einer Datenbank reinschreiben. Das bekomme ich aber nicht.
Deshalb habe ich auf jedem RPi eine eigene Datenbank wo alle Signale reingeschrieben werden.
Ich möchte aber nur eine Datenbank zum späteren Auswerten haben.
Wie gehe ich da am besten vor?
Kann ich dem RPi (1) sagen, dass er sofort übers Netzwerk die Daten in die DB2 reinschreiben soll, geht das???
mein Problem ist, dass ich zwei RPi´s habe die mit einem Dlink Router übers Netzwerk verbunden sind.
An jedem RPi ist ein GPIO Adapter verbaut, sodass ich jeweils 17 GPIO´s pro RPi zur Verfügung habe.
Ich habe 27 Signale die ich auswerten möchte, sodass ich ja mit einem RPi nicht auskommen würde. Deshalb auch die zwei RPi´s.
Jetzt möchte ich gerne alle 29 Signale in nur einer Datenbank reinschreiben. Das bekomme ich aber nicht.
Deshalb habe ich auf jedem RPi eine eigene Datenbank wo alle Signale reingeschrieben werden.
Ich möchte aber nur eine Datenbank zum späteren Auswerten haben.
Wie gehe ich da am besten vor?
Kann ich dem RPi (1) sagen, dass er sofort übers Netzwerk die Daten in die DB2 reinschreiben soll, geht das???
- Hyperion
- Moderator
- Beiträge: 7478
- Registriert: Freitag 4. August 2006, 14:56
- Wohnort: Hamburg
- Kontaktdaten:
Wieso nicht :KPeter Pan hat geschrieben: Jetzt möchte ich gerne alle 29 Signale in nur einer Datenbank reinschreiben. Das bekomme ich aber nicht.
Kann man machen - muss man aber nicht!Peter Pan hat geschrieben: Deshalb habe ich auf jedem RPi eine eigene Datenbank wo alle Signale reingeschrieben werden.
Da gibt es verschiedene Ansätze, aber letztlich läuft es so oder so auf *Netzwerkkommunikation* hinaus!Peter Pan hat geschrieben: Ich möchte aber nur eine Datenbank zum späteren Auswerten haben.
Wie gehe ich da am besten vor?
Du musst die Messwerte eben über das Netzwerk an einen Dienst schicken, der diese dann in eine DB speichert. "Große" RDBMS bieten so etwas von Hause aus an; das macht es an sich trivial, da man lediglich die DB konfigurieren muss, dass die Anfragen aus einem bestimmten Subnetz akzeptiert und dann noch die Verbindung in den Messscripten entsprechend so konfigurieren muss, dass man den DB-Server angibt.
Das direkte Schreiben über Netzwerk in eine DB hat sicherheitstechnisch einige Nachteile, bei einem kleinen Heimnetz sehe ich da allerdings wenig Probleme

Alternativ kannst Du auch einen "hippen" REST-Webservice dazwischen klemmen, an den Du die Messdaten sendest.
Ultra hippe Menschen setzen dagegen eine MessageQueue (MQTT für IoT natürlich) auf und schließen Sensoren und DB an diese an...

encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
assert encoding_kapiert
- Hyperion
- Moderator
- Beiträge: 7478
- Registriert: Freitag 4. August 2006, 14:56
- Wohnort: Hamburg
- Kontaktdaten:
Du meinst sicher "allgemein"... denn Du brauchst offenbar viel stärker konkretisierende Antworten.Peter Pan hat geschrieben:Mit so spezifischen Antworten kann ich leider nichts anfangen.
Also:
1.) Setze eine PostgreSQL-DB irgend wo auf einem im Netzwerk bei Dir erreichbaren Rechner auf. (Kann auch auf *einem* RasPi sein!)
2.) Stelle den Server so ein, dass Du ihn von den RasPis erreichen kannst. (Kannst Du simpel über ein Konsolenclient testen, den Du auf dem Client-Rechner natürlich installieren musst)
3.) Erstelle die gewünschte Datenbank und die Tabellen (ggf. über ein Admin-Tool)
4.) Installiere psycopg als DB-Treiber für Python; sollte über ``pip`` simpel sein!
5.) Stelle Deine bisherigen Scripte auf psycopg um; dank recht einheitlichen DB-API geht das recht einfach. Die Verbindung muss geändert bzw ergänzt werden und ggf. die Platzhaltersyntax bei den Queries.
6.) Freue Dich

encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
assert encoding_kapiert
- noisefloor
- User
- Beiträge: 4159
- Registriert: Mittwoch 17. Oktober 2007, 21:40
- Wohnort: WW
- Kontaktdaten:
Hallo,
@Hyperion: sehr schön erklärt
@Peter Pan: das du am Ende nur _eine_ DB brauchst ging aus deinen ersten Posts echt nicht hervor. Auch den Lösungsansatz war ein bisschen kompliziert. Jedenfalls ist es ganz einfach, siehe Hyperions Erklärung.
Gruß, noisefloor
@Hyperion: sehr schön erklärt

@Peter Pan: das du am Ende nur _eine_ DB brauchst ging aus deinen ersten Posts echt nicht hervor. Auch den Lösungsansatz war ein bisschen kompliziert. Jedenfalls ist es ganz einfach, siehe Hyperions Erklärung.
Gruß, noisefloor
Verstehe zwar wieder nur die hälfte, aber ich werde es mal nach Anleitung probieren.
Wäre es auch möglich, dass ich die eine DB von dem ersten Raspberry als txt exportiere in einen Ordner packe und von dem anderen Raspberry auf diesen Ordner zugreifen kann und die txt dann einlesen kann???
Dann hätte ich auch meine Tabellen/Messwerte auf der Datenbank des zweiten Raspberries oder???
Ich habe jetzt beide RPi´s an einen Switch (D-Link) Router angeschlossen und den RPi´s feste IP´s verpasst. Über Remotedesktop kann ich so von meinem PC aus über WLan des D-Link Routers beide RPI´s ansteuern. Ach ja auf dem einen RPI läuft auch ein Webserver.
Wenn ich jetzt weiter wüsste???
Ist das ein alternativer Lösungsansatz?
Wäre es auch möglich, dass ich die eine DB von dem ersten Raspberry als txt exportiere in einen Ordner packe und von dem anderen Raspberry auf diesen Ordner zugreifen kann und die txt dann einlesen kann???
Dann hätte ich auch meine Tabellen/Messwerte auf der Datenbank des zweiten Raspberries oder???
Ich habe jetzt beide RPi´s an einen Switch (D-Link) Router angeschlossen und den RPi´s feste IP´s verpasst. Über Remotedesktop kann ich so von meinem PC aus über WLan des D-Link Routers beide RPI´s ansteuern. Ach ja auf dem einen RPI läuft auch ein Webserver.
Wenn ich jetzt weiter wüsste???
Ist das ein alternativer Lösungsansatz?
Ob du jetzt von einem PI auf den anderen zugreifst und eine Textdatei rueberschiebst, oder einfach gleich eine Datenbank ala MySQL laufen laesst - das macht doch keinen Unterschied. Entweder sehen die sich im Netz, oder nicht. Wenn ja, dann ist der DB-Ansatz ganz sicher simpler. Denn mit deinem Datei-Ansatz hast du einen Sack Zusatzprobleme. Wann darfst du die denn lesen? Wie stellst du sicher, dass PI A der die schreibt fertig ist, bevor PI B sie liest? Wie stellst du sicher, dass PI B die gelesen *HAT*, bevor PI A wieder eine schreibt? Usw...
Installier doch einfach mal MySQL (oder Postgres... das bevorzuge ich zumindest) auf PI B, und verbinde dich von beiden PIs damit. Das ist dann 80% der Miete..
Installier doch einfach mal MySQL (oder Postgres... das bevorzuge ich zumindest) auf PI B, und verbinde dich von beiden PIs damit. Das ist dann 80% der Miete..
- noisefloor
- User
- Beiträge: 4159
- Registriert: Mittwoch 17. Oktober 2007, 21:40
- Wohnort: WW
- Kontaktdaten:
Hallo,
Gruß, noisefloor
Wäre es auch möglich, dass ich die eine DB von dem ersten Raspberry als txt exportiere in einen Ordner packe und von dem anderen Raspberry auf diesen Ordner zugreifen kann und die txt dann einlesen kann???
Theoretisch ja, praktisch viel zu kompliziert!Ist das ein alternativer Lösungsansatz?
+1 , das "Rezept" hat Hyperion dir geliefert. Wenn du es anhand dessen nicht nachvollziehen kannst... na ja, dann wird es für die schwierig, dein Vorhaben zu realisieren.Installier doch einfach mal MySQL (oder Postgres... das bevorzuge ich zumindest) auf PI B, und verbinde dich von beiden PIs damit. Das ist dann 80% der Miete..
Gruß, noisefloor
Ich kann leider kein MySQL aufm Raspberry laufen lassen. Warum wisst ihr ja bestimmt. Das ist ja überhaupt auch das Problem was ich habe. Mit MySQl ist das easy. Nur die läuft ja permanent, das wäre eine zu große Resourcenverschwendung.
Naja trotzdem danke für die Tipps.
Naja trotzdem danke für die Tipps.
@Peter Pan: Also ich weiss ehrlich gesagt nicht was das Problem daran ist MySQL oder PostgreSQL auf einem Raspi laufen zu lassen. Es gibt viele Leute die das machen. Kannst Du die angebliche Ressourcenverschwendung mal beziffern? Und was heisst ”läuft permanent”? Klar da ist ein Daemon der auf Verbindungen wartet, aber ob das nun ein DBMS ist oder etwas eigenes von Dir was das was ein DBMS an der Stelle macht mit SQLite nachbaut ist doch im Grunde das selbe.
- Hyperion
- Moderator
- Beiträge: 7478
- Registriert: Freitag 4. August 2006, 14:56
- Wohnort: Hamburg
- Kontaktdaten:
Die Datenbank kann ja auch auf einem Drittrechner laufen, der keinen Strom sparen muss :K
Ich meine das hätte ich sogar vorgeschlagen...
Ich meine das hätte ich sogar vorgeschlagen...
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
assert encoding_kapiert