Variable in Datenbank speichern

Heute ist Stammtischzeit:
Jeden Donnerstag 20:30 Uhr hier im Chat.
Wer Lust hat, kann sich gerne beteiligen. ;)
  • Hallo und einen schönen guten Abend,

    ich habe ein kleines Problem, wobei ich hoffe, das einer von euch mir helfen kann.

    Ich schreibe gerade ein script in Phyton und da muss ich eine Variable in der Datenbank speichern. Als Datenbank verwende ich SQlite3.

    Das speichern direkt ist nicht das Problem sondern das ich verschiedene Variablen habe.

    Das script sieht so aus:

    Ich verwende ein Python script das mir die einzelnen Rasenflächen wässert. Und diese Schleife verwende ich für alle Felder.

    Aber je nach dem welches Feld gerade bewässert wird, ändert sich in der 7. Zeile die Variablen die mit XXXX gekennzeichnet sind. Im Feld XXXXX_Zeit steht der Name des Feldes wie z.B. RasenKüche_Zeit oder RasenTeich_Zeitund im 2. XXXXXX Feld steht die Bewäasserungszeit zeit der Beregnung.

    in PHP ist das für mich kein Problem aber wie muss ich der String in Python geschrieben werden.

    Für eure Hilfe schon mein herzlichen Dank.

  • Hallo,

    du erstellst in deiner Schleife eine Verbindung nach der anderen ohne auch mal eine zu schließen. Es würde sich anbieten, die Verbindung vor der Schleife zu öffnen.

    Wenn du eine Schleife haben möchtest, die so lange läuft, bis eine Bedingung erfüllt wurde, dann brauchst du dafür nicht extra eine Variable verwendent. Das geht mit 'while True' und 'break'.


    Grüße

    Dennis

    🎧 With the music execution and the talk of revolution, it bleeds in me and it goes 🎧

  • @TE

    Danke für den Script.

    Bin erst über das f in der Zeile gestolpert. Dachte das wäre dir da zwischen gerutscht.

    Muste aber feststellen das es richtig war. Das war mir bis jetzt unbekannt.

    Steht das f für das im Spring variablen mit eingebunden sind?

    Dennis89

    Danke für den Hinweis. Hatte das erst Anfangs auch anders geschrieben. Nur da ich Probleme hatte, habe ich solche Sachen erst wieder raus genommen um den Fehler einzugrenzen.

    Und Danke für eure schnelle Hilfe

  • Grundsätzlich gehören Daten nicht in den Query, egal in welcher Sprache.

    Ich würde mir noch mal Gedanken über die Struktur der Datenbank machen. Das mit den f-strings ist praktisch, führt aber praktisch auch zu fatalen Sicherheitslücken, wenn die Daten z.B. aus Benutzer-Eingaben stammen und nicht vor der Interpretation des SQL-Parsers nicht geschützt werden.

    Genau deswegen kann man der execute-Methode ein zusätzliches Objekt mit Daten übergeben. Die Daten werden vor der Interpretation des SQL-Parser dann geschützt (escaped).


    Hier eine entschärfte Variante, wobei mir noch nicht ganz klar ist, wieso du eine komplette Spalte aktualisieren möchtest.

    Man kann nicht Tabellennamen oder Spaltennamen im SQL-Query als Variablen setzen. Wenn man das muss, dann ist die Struktur schon falsch.


  • Mal ne Frage am Rande: Welchen Zweck hat es eigentlich, während der Bewässerung die Zeit Minütlich in der Datenbank zu speichern?

    Oh, man kann hier unliebsame Nutzer blockieren. Wie praktisch!

  • Normalerweise speichert man nur die Zustandsänderungen.

    Wenn sich der aktuelle Zustand zu vorherigen Zustand unterscheidet -> Neuer Eintrag

    Wenn kein alter Zustand vorhanden ist, da erst gerade das Programm gestartet wurde -> Aktuellen Zustand speichern

    Das hat den Vorteil, dass bei geringer Ereignisdichte viel weniger Daten entstehen.

    Wenn man hingegen alle 5 Minuten den aktuellen Zustand erfasst und speichert, verpasst man alles innerhalb der 5 Minuten.

    Wenn z.B. 24 Stunden nichts passiert, wird 7200 Mal unnötigerweise der gleiche Zustand gespeichert.

    Dann ist mir noch aufgefallen, dass du mit der Angabe des Orts in der Spalte ort einen str hast.

    Genauso gut könntest du eine zweite Tabelle mit ids und ortnamen haben, die dann in der Spalte ort referenziert wird.

    Dann muss man nur einen int speichern. Das ist auch der Zweck von relationalen Datenbanken.

    Anders sieht bei Sensordaten aus, da man ja Werte in bestimmten Zeitabständen möchte.

    Aber dafür setzt man ja InfluxDB/Grafana ein.

    Zustandsänderungen lassen sich damit natürlich auch erfassen.

    Der Vorteil und Nachteil von sqlite ist die Abwesenheit einer Netzwerkfunktionalität (Client/Server-Modell).

    Der große Vorteil ist, dass sqlite keinen Server benötigt und die Datenbank in einer Datei ist.

  • Danke für eure Ratschläge.

    Das dass nicht die feine Art ist weiß ich auch. Nur meine Kenntnisse sind noch nicht so groß das ich solche komplexe Sachen realisieren kann.

    Und was die Sicherheit betrifft, da mach ich mir nicht so die Sorgen, da der Raspberry nicht im W-Lan und auch keine Verbindung zum Internet hat.

    Die 3 Raspberry die ich habe sind über ein seperates LAN Netz mit einande Verbunden.
    Das ich die Zeit der Bewässerung über ein Monitor eingeben kann, möchte ich darüber kontrolieren wie lange die Bewässerung dauert.
    Das ist der Grund warum ich die Restzeit in der Datenbank speichern wollte.

  • Du hast also drei Pis, zwei für die Bewässerung und einer, der als Monitor zur Steuerung dient - und auf dem willst du den aktuellen Stand der Bewässerungs-Pis anzeigen...?

    Dann nutzt du die Datenbank sozusagen zum Austausch der Daten. Ein Pi schriebt sie rein, der andere liest sie aus... Das ist eigentlich nicht der Sinn von Datenbanken.
    Du könntest dir mal ansehen, wie man Daten zwischen Rechnern direkt austauscht. In deinem Fall bieten sich wahrscheinlich Sockets ganz gut an.

    Oh, man kann hier unliebsame Nutzer blockieren. Wie praktisch!

  • Hallo,

    das ist echt umständlich gelöst... Eleganter kannst du das machen, indem du eine Datenbank nimmst, bei der du a) eine TTL (Time to live) für einen Wert hinterlegen kannst und b) die verbleibende TTL abfragen kannst - sofern du bei einer DB bleiben willst. Redis kann das zum Beispiel.

    Wenn das ganze nicht kritisch ist würde ich die Daten direkt im Speicher halten und garnicht erst wegschreiben.

    Gruß, noisefloor

Jetzt mitmachen!

Du hast noch kein Benutzerkonto auf unserer Seite? Registriere dich kostenlos und nimm an unserer Community teil!