Skip to content

Python & Redis-Datenbank

Verschoben Linux
  • 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!!

  • FrankMF FrankM verschob dieses Thema von Privat am
  • 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)
    
  • 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.

  • 0 Stimmen
    4 Beiträge
    717 Aufrufe
    FrankMF

    Ich parke das mal hier, damit ich das nicht noch mal vergesse. Hat mich eben mal wieder eine Stunde gekostet 😞

    /etc/ansible/ansible.cfg

    [defaults] host_key_checking = False

    Edit -> https://linux-nerds.org/topic/1493/ansible-host_key_checking

  • Python - Formatumwandlung str -> float

    Python3
    1
    0 Stimmen
    1 Beiträge
    189 Aufrufe
    Niemand hat geantwortet
  • Python - Frameworks

    Python3
    2
    0 Stimmen
    2 Beiträge
    78 Aufrufe
    FrankMF

    Und mal hier parken

  • Example Class

    Angeheftet Python3
    3
    0 Stimmen
    3 Beiträge
    104 Aufrufe
    FrankMF

    In meinem PywebIO Projekt tauchte heute ein alter Bekannter auf. Wenn ich einen Eintrag (innerhalb der Liste) löschte, war das etwas durcheinander 🤔

    Ja, den Fehler kenne ich schon was länger und stolper immer mal wieder drüber. Heute z.B.

    Also mal grübeln 🤓

    Das mache ich, wenn ich einen Eintrag lösche

    case 'Yes': # delete entrie BackupList.delete((line - 1)) # save json BackupList.save_json() # Load data from filesystem BackupList.load_json() # Reload Tab Backup backup()

    Ich mache folgendes

    lösche den Eintrag speicher die Liste lade die Liste baue den Tab wieder auf

    Das führt aber dazu, das meine Liste die als Objekt im Speicher steht nicht aktuell ist. Im Gegenteil, da ist dann etwas Unordnung. Ich brauchte also die Möglichkeit mein Objekt backups irgendwie zurückzusetzen.

    Mal gegoogelt und die Dinge sind manchmal wirklich total easy 🙂

    # clear dict backups.clear()

    Das leert das Objekt und im nächsten Schritt kann ich es wieder befüllen.

    Lösung case 'Yes': # delete entrie BackupList.delete((line - 1)) # save json BackupList.save_json() # clear dict backups.clear() # Load data from filesystem BackupList.load_json() # Reload Tab Backup backup()

    Problem erledigt. Damit ich das noch finde, wenn mein Kopf das nicht mehr hergibt, notiere ich das hier.

  • Qt 5 Designer

    Python3
    1
    0 Stimmen
    1 Beiträge
    97 Aufrufe
    Niemand hat geantwortet
  • 0 Stimmen
    1 Beiträge
    306 Aufrufe
    Niemand hat geantwortet
  • Linux Befehle - ls & tail

    Linux
    1
    0 Stimmen
    1 Beiträge
    330 Aufrufe
    Niemand hat geantwortet
  • Projekt Ryzen7 & X570 Mainboard

    Linux
    25
    0 Stimmen
    25 Beiträge
    2k Aufrufe
    FrankMF

    Nach sehr langer Zeit, habe ich heute mal wieder ein aktuelles BIOS geflashed.

    9f33e13e-92f8-452e-b238-5469bdc6d571-grafik.png

    Link Preview Image MPG X570 GAMING PLUS

    Satisfying gamers with what they really need, MPG X570 GAMING PLUS is equipped with Extended Heatsink Design, Frozr Heatsink Design, Core boost, Lightning Gen4 M.2, M.2 Shield Frozr accessory, Game Boost, Turbo USB and MSI latest Dragon Center. Black and

    favicon

    (de.msi.com)

    20220409_084823.jpg

    20220409_084852.jpg

    Danach Neustart, bootet wie es soll. Damit wäre mein Mainboard kompatibel für den wohl letzten Prozessor auf dem AM4 basierenden Board.

    Ryzen 7 5800X3D

    Gamestar schreibt dazu

    AMD möchte mit einem neuen Prozessor noch einmal ein Spitzenmodell für Spieler bringen, welches auf dem aktuellen Sockel AM4 basiert. Künftige Modelle werden auf einen neuen Sockel namens AM5 setzen. Der wohl letzte Prozessor für mit AM4 und damit auch die Zen-3-Architektur bringt aber noch eine Besonderheit mit sich.
    Quelle: https://www.gamestar.de/artikel/ryzen-7-5800x3d-tests-spieler,3379594.html

    Das PC Magazin schreibt zu Preis und Verfügbarkeit

    Am 15. März hat AMD den Preis und die Verfügbarkeit des Ryzen 7 5800X3D bekannt gegeben. Demnach wird die neue CPU mit 3D V-Cache am 20. April zu einer UVP von 449 US-Dollar ( rund 408 Euro) erscheinen.
    Quelle: https://www.pc-magazin.de/ratgeber/amd-ryzen-7-5800-prozessor-cpu-infos-preis-release-specs-3202912.html

    Ich bin sehe gespannt, ob der USB-Bug endlich behoben wurde. Ihr erinnert Euch? Wenn ich komplett neu starte, dann kann ich keine Eingabe machen. Tastatur und Maus ohne Funktion.

    Ich verrate Euch sicherlich nicht zu viel, wenn ich aktuell eine Neuanschaffung plane, so ein AM5 Brett würde mich schon reizen 🙂 Denke, das war der letzte Beitrag zu diesem Projekt 😉