Skip to content
  • Kategorien
  • World
  • Aktuell
  • Tags
  • Beliebt
Skins
  • Light
  • Cerulean
  • Cosmo
  • Flatly
  • Journal
  • Litera
  • Lumen
  • Lux
  • Materia
  • Minty
  • Morph
  • Pulse
  • Sandstone
  • Simplex
  • Sketchy
  • Spacelab
  • United
  • Yeti
  • Zephyr
  • Dark
  • Cyborg
  • Darkly
  • Quartz
  • Slate
  • Solar
  • Superhero
  • Vapor

  • Standard: (Kein Skin)
  • Kein Skin
Einklappen
linux-nerds.org

linux-nerds.org

  1. Übersicht
  2. Linux
  3. Python & Redis-Datenbank

Python & Redis-Datenbank

Geplant Angeheftet Gesperrt Verschoben Linux
pythonredis
3 Beiträge 1 Kommentatoren 195 Aufrufe
  • Älteste zuerst
  • Neuste zuerst
  • Meiste Stimmen
Antworten
  • In einem neuen Thema antworten
Anmelden zum Antworten
Dieses Thema wurde gelöscht. Nur Nutzer mit entsprechenden Rechten können es sehen.
  • FrankMF Offline
    FrankMF Offline
    FrankM
    schrieb am zuletzt editiert von FrankM
    #1

    Erste Gehversuche mit einer Redis DB & Python.

    Was ist Redis?

    The open source, in-memory data store used by millions of developers as a database, cache, streaming engine, and message broker.

    Ich nutze Redis schon länger, z.B. in diesem Forum als Datenbank oder als lokaler Cache für meine Nextcloud Installation.

    Die Redis DB läuft als Docker Container zum Testen.

    docker run -d --name redis-stack-server -p 6379:6379 redis/redis-stack-server:latest
    

    und in der Python Umgebung dann

    pip install redis
    

    Erster Test

     import redis
     
     data = {
             'project' : 'Portfolio',
             "version": "0.0.1",
             "settings_path": "/home/frankm/settings_portfolio.json",
             "theme": "dark"
         }
     
     r = redis.Redis(host='localhost', port=6379, db=0)
     r.json().set('settings', '$', data)  # DB setzen und mit Daten (data) füllen
     
     json_settings = r.json().get('settings', '$')
     main_settings = r.json().get('settings', '$.main_settings')
     project_name = r.json().get('settings', '$..project')
     version = r.json().get('settings', '$..version')
     
     print(json_settings)
     # [{'main_settings': {'project': 'Portfolio', 'version': '0.0.1', 'settings_path': '/home/frankm/settings_portfolio.json', 'theme': 'dark'}}]
     
     print(main_settings)
     # [{'project': 'Portfolio', 'version': '0.0.1', 'settings_path': '/home/frankm/settings_portfolio.json', 'theme': 'dark'}]
     
     print(project_name)
     # ['Portfolio']
     
     print(project_name[0])
     # Portfolio
     
     # Wir aktualisieren das data objekt mit einem neuen Wert.
     data.update({"version": "0.0.2"})
     print("DATA", data)
     
     # Wir speichern das data objekt in der Redis Datenbank
     r.json().set('settings', '$', data)  # DB setzen und mit Daten (data) füllen
     # Kontrolle ob Version 0.0.2 ist
     json_settings = r.json().get('settings', '$')
     version = r.json().get('settings', '$..version')
     print(json_settings)
     print(version)
    

    Ausgabe

    /home/frankm/PycharmProjects/redis/venv/bin/python /home/frankm/PycharmProjects/redis/main.py 
    [{'project': 'Portfolio', 'version': '0.0.1', 'settings_path': '/home/frankm/settings_portfolio.json', 'theme': 'dark'}]
    []
    ['Portfolio']
    Portfolio
    DATA {'project': 'Portfolio', 'version': '0.0.2', 'settings_path': '/home/frankm/settings_portfolio.json', 'theme': 'dark'}
    [{'project': 'Portfolio', 'version': '0.0.2', 'settings_path': '/home/frankm/settings_portfolio.json', 'theme': 'dark'}]
    ['0.0.2']
    
    Process finished with exit code 0
    

    Erster Test erfolgreich!

    Zweiter Test

    import redis
    
    data = {
        'main_settings': {
            'project' : 'Portfolio',
            "version": "0.0.1",
            "settings_path": "/home/frankm/settings_portfolio.json",
            "theme": "dark"
        }
    }
        
    r = redis.Redis(host='localhost', port=6379, db=0)
    r.json().set('settings', '$', data)  # DB setzen und mit Daten (data) füllen
    
    json_settings = r.json().get('settings', '$')
    main_settings = r.json().get('settings', '$.main_settings')
    project_name = r.json().get('settings', '$..project')
    version = r.json().get('settings', '$..version')
    
    print(json_settings)
    # [{'main_settings': {'project': 'Portfolio', 'version': '0.0.1', 'settings_path': '/home/frankm/settings_portfolio.json', 'theme': 'dark'}}]
    
    print(main_settings)
    # [{'project': 'Portfolio', 'version': '0.0.1', 'settings_path': '/home/frankm/settings_portfolio.json', 'theme': 'dark'}]
    
    print(project_name)
    # ['Portfolio']
    
    print(project_name[0])
    # Portfolio
    
    # Wir aktualisieren das data objekt mit einem neuen Wert.
    data['main_settings']["version"] = "0.0.2"
    data.update()
    
    #data.update({"version": "0.0.2"})
    print("DATA", data)
    
    # Wir speichern das data objekt in der Redis Datenbank
    r.json().set('settings', '$', data)  # DB setzen und mit Daten (data) füllen
    # Kontrolle ob Version 0.0.2 ist
    json_settings = r.json().get('settings', '$')
    version = r.json().get('settings', '$..version')
    print(json_settings)
    print(version)
    

    Ausgabe

    /home/frankm/PycharmProjects/redis/venv/bin/python /home/frankm/PycharmProjects/redis/main.py 
    [{'main_settings': {'project': 'Portfolio', 'version': '0.0.1', 'settings_path': '/home/frankm/settings_portfolio.json', 'theme': 'dark'}}]
    [{'project': 'Portfolio', 'version': '0.0.1', 'settings_path': '/home/frankm/settings_portfolio.json', 'theme': 'dark'}]
    ['Portfolio']
    Portfolio
    DATA {'main_settings': {'project': 'Portfolio', 'version': '0.0.2', 'settings_path': '/home/frankm/settings_portfolio.json', 'theme': 'dark'}}
    [{'main_settings': {'project': 'Portfolio', 'version': '0.0.2', 'settings_path': '/home/frankm/settings_portfolio.json', 'theme': 'dark'}}]
    ['0.0.2']
    
    Process finished with exit code 0
    
    Process finished with exit code 0
    

    Zweiter Test erfolgreich

    Bitte niemals Redis Datenbanken OHNE Passwort im Netz laufen lassen. Danke!!

    Im Fediverse -> @FrankM@nrw.social

    1. NanoPi R5S
    2. Quartz64 Model B, 4GB RAM
    3. Quartz64 Model A, 4GB RAM
    4. RockPro64 v2.1
    1 Antwort Letzte Antwort
    0
    • FrankMF FrankM verschob dieses Thema von Privat am
    • FrankMF Offline
      FrankMF Offline
      FrankM
      schrieb am zuletzt editiert von FrankM
      #2

      Ok, das o.g dient ja nur der groben Orientierung und dazu zu schauen ob das funktioniert und man es evt. auch verstanden hat 😉

      Das muss man aber ein wenig anders in ein vorhandenes Projekt einbauen. Wir bauen uns mal eine Klasse dafür.

      Wir brauchen eine Initialisierung, damit man mit Redis überhaupt arbeiten kann.

      #####################
      # Init Redis
      #####################
      r = redis.Redis(host='192.168.3.213', port=6379, db=0)
      
      # Redis Server am Leben?
      try:
          response = r.ping()
          print("Client =", r.ping())
          print("Client =", type(r.ping()))
      except redis.ConnectionError:
          exit("Konnte keine Verbindung zum Redis-Server aufbauen")
      

      Ok, hier mal wieder der alt bekannte Fehler. Benutzt bitte durchgehend englische Wörter beim Coden. Es macht das Leben einfacher. Ich verfalle leider beim Ausprobieren von Funktionen und neuen Dingen immer wieder dazu es in deutsch zu beschriften. Macht später dann immer viel Arbeit...Also bitte sofort richtig machen.

      Zum obigen Code. Wir initialisieren die Redis Datenbankverbindung. Danach ein kurzer Test, ob der Docker Container läuft, wenn nicht gibt es eine Fehlermeldung.

      Danach die Klasse und die erste Funktioen. Wir erzeugen einen Eintrag in der DB. Dazu erstellen wir ein Dictonary und speichern es. Die Funktion kommt später.

      ###############################################
      # Class for Redis DB
      ###############################################
      class Redis:
          """ Class to handle Redis DB
          Data ia stored in Docker Container
          atm not persistent
          """
      
          @staticmethod
          def init():
              data = {}
      
              data = {
                  'project': 'Portfolio',
                  "version": "0.0.1",
                  "settings_path": str(settings_path),
                  "theme": "dark"
              }
              Redis.save(data)
              return (data)
      

      Nun liegen die Daten in der Redis Datenbank, Doch wir müssen sie ja auch irgendwie in unser Projekt laden.

      @staticmethod
          def load():
              data = {}
              # Wir laden die Daten aus der Redis DB und erzeugen die Dictonary data
              # diese wird zurückgegeben!
      
              project = r.json().get('settings', '$..project')
              version = r.json().get('settings', '$..version')
              settings_path = r.json().get('settings', '$..settings_path')
              theme = r.json().get('settings', '$..theme')
      
              data = {
                  'project': str(project[0]),
                  "version": str(version[0]),
                  "settings_path": str(settings_path[0]),
                  "theme": str(theme[0])
              }
              return(data)
      

      Nun die Funktion zum Speichern

      @staticmethod
          def save(file):
      
              try:
                  r.json().set('settings', '$', file)  # DB setzen und mit Daten (data) füllen
              except:
                  print("Error")
      

      Was macht man, wenn man nur einen Wert ändern möchte?

      @staticmethod
          def update(key, value):
      
              # Example: Redis.update('version', '0.0.9')
      
              settings.update({key: value})
      
              Redis.save(settings)
      

      Und nun, was ich dann noch mache.

      settings = Redis.init()
      

      wenn noch nichts vorhanden ist. Ansonsten

      settings = Redis.load()
      

      Damit lade ich die Daten in das Python Objekt settings.

      Und so spricht man dann die Daten an.

      print("Theme:", settings['theme'])
      print("Version:", settings['version'])
      

      Ändern eines Wertes

      Redis.update('version', '0.0.2')
      

      Und zum Speichern des Ganzen Datensatzes (settings)

      Redis.save(settings)
      

      Im Fediverse -> @FrankM@nrw.social

      1. NanoPi R5S
      2. Quartz64 Model B, 4GB RAM
      3. Quartz64 Model A, 4GB RAM
      4. RockPro64 v2.1
      1 Antwort Letzte Antwort
      0
      • FrankMF Offline
        FrankMF Offline
        FrankM
        schrieb am zuletzt editiert von FrankM
        #3

        Heute dann die nächste Herausforderung. Mein JSON soll so aussehen, damit ich das entsprechend erweitern kann.

        Stocks {0: {'stockname': 'Deutsche Telekom Aktie', 'wkn1': '4534543534', 'wkn2': 'sfsdfsdfsfdfd', 'quantity': 100}, 1: {'stockname': 'Henkel', 'wkn1': '4534543534', 'wkn2': 'sfsdfsdfsfdfd', 'quantity': 50}}
        

        Die Daten sollen wie oben schon ausprobiert, in einer Redis Datenbank liegen. So weit auch kein großes Problem. ABER, der Zugriff auf diese Daten war dann meine nächste Hürde 🙂

        Ok, ich habe also mehrere Einträge im JSON File bzw. in der Datenbank. Wie komme ich da nun wieder dran. Ein paar ☕ später dann die Lösung.

        Wie komme ich an den einzelnen Eintrag, also über den Index??

        r1.json().get('stocks', 1)
        

        Gibt als Ergebnis

        {'stockname': 'Henkel', 'wkn1': '4534543534', 'wkn2': 'sfsdfsdfsfdfd', 'quantity': 50}

        Ok, das passt schon mal. Somit kann man dann gewohnt auf die einzelnen Elemente zugreifen.

        print("TESTING", testing['stockname'])
        

        Ausgabe

        TESTING Henkel
        

        Ok, Teil 1 erledigt. Jetzt habe ich ja irgendwann mehrere Elemente in der Liste und brauch dann den letzten Index , um damit was machen zu können. Also, z.B. durch die Daten zu loopen.

        objkeys = r1.json().objkeys('stocks')
        print("Objkeys", objkeys)
        

        Ausgabe

        Objkeys ['0', '1']
        

        Ok, kommt eine Liste des Index zurück. Damit kann man arbeiten 😉

        Ich hatte dann zum Testen mittels einer while Schleife die Daten geladen, aber jetzt beim Tippen klingelt es und wir machen das schön mit enumerate 😉

        @staticmethod
        def load():
            data = {}
        
            for count, value in enumerate(objkeys):
                testing = r1.json().get('stocks', count)
                data[count] = {
                    "stockname": testing['stockname'],
                    "wkn1": testing['wkn1'],
                    "wkn2": testing['wkn2'],
                    "quantity": testing['quantity']}  
           return data
        

        Somit habe ich die Daten aus der Redis Datenbank in einem Objekt und kann damit arbeiten.

        Im Fediverse -> @FrankM@nrw.social

        1. NanoPi R5S
        2. Quartz64 Model B, 4GB RAM
        3. Quartz64 Model A, 4GB RAM
        4. RockPro64 v2.1
        1 Antwort Letzte Antwort
        0
        Antworten
        • In einem neuen Thema antworten
        Anmelden zum Antworten
        • Älteste zuerst
        • Neuste zuerst
        • Meiste Stimmen


        • FrankMF

          Pycharm - Interpreter Settings

          Beobachtet Ignoriert Geplant Angeheftet Gesperrt Verschoben Python3 python pycharm
          1
          2
          0 Stimmen
          1 Beiträge
          168 Aufrufe
          Niemand hat geantwortet
        • FrankMF

          Flask Projekt auf einem anderen Rechner installieren

          Beobachtet Ignoriert Geplant Angeheftet Gesperrt Verschoben Python3 python flask linux
          1
          0 Stimmen
          1 Beiträge
          183 Aufrufe
          Niemand hat geantwortet
        • FrankMF

          Redis Insight - Desktop UI

          Beobachtet Ignoriert Geplant Angeheftet Gesperrt Verschoben Redis redis linux
          1
          3
          0 Stimmen
          1 Beiträge
          146 Aufrufe
          Niemand hat geantwortet
        • FrankMF

          Pycharm - Umzug auf neuen Rechner

          Beobachtet Ignoriert Geplant Angeheftet Gesperrt Verschoben Linux pycharm linux python
          1
          0 Stimmen
          1 Beiträge
          127 Aufrufe
          Niemand hat geantwortet
        • FrankMF

          Ruff - Linting

          Beobachtet Ignoriert Geplant Angeheftet Gesperrt Verschoben Python3 ruff python
          1
          1
          0 Stimmen
          1 Beiträge
          116 Aufrufe
          Niemand hat geantwortet
        • FrankMF

          List comprehensions

          Beobachtet Ignoriert Geplant Angeheftet Gesperrt Verschoben Python3 python
          1
          2
          0 Stimmen
          1 Beiträge
          104 Aufrufe
          Niemand hat geantwortet
        • FrankMF

          Portainer - NodeBB Container erstellen

          Beobachtet Ignoriert Geplant Angeheftet Gesperrt Verschoben Linux nodebb portainer linux redis
          1
          5
          0 Stimmen
          1 Beiträge
          344 Aufrufe
          Niemand hat geantwortet
        • FrankMF

          Redis installieren

          Beobachtet Ignoriert Geplant Angeheftet Gesperrt Verschoben Redis linux redis
          1
          0 Stimmen
          1 Beiträge
          418 Aufrufe
          Niemand hat geantwortet
        Powered by NodeBB | Contributors
        © 2022 frank-mankel.de
        Fediverse
        • Anmelden

        • Du hast noch kein Konto? Registrieren

        • Anmelden oder registrieren, um zu suchen
        • Erster Beitrag
          Letzter Beitrag
        0
        • Kategorien
        • World
        • Aktuell
        • Tags
        • Beliebt