SQL Query in Matplot / einzelne Werte

mit matplotlib, NumPy, pandas, SciPy, SymPy und weiteren mathematischen Programmbibliotheken.
Antworten
cbesi
User
Beiträge: 41
Registriert: Dienstag 11. August 2020, 22:04

Hallo zusammen,

ich möchte 2 Werte aus einem SQL Query mit Matplot in einem Balkendiagramm darstellen.

Meine Werte bekomme ich aus der SQL extrahiert, aber wie übergebe ich diese als Tuple an Matplot?

Hier mein Code:

Code: Alles auswählen

import json
import firebirdsql
import pymysql
import matplotlib.pyplot as plt
import numpy as np





def visu(betriebid):

    # Parameter für Datenbank aus json lesen
    with open('db.json', encoding="utf8") as json_file:
        data = json.load(json_file)

 #   # Verbindung zur Firebird Datenbank herstellen
 #   fbconn = firebirdsql.connect(
 #       host=(data['DB_Path']['Server']),
 #       database=(data['DB_Path']['Pfad']),
 #       port=(data['DB_Path']['Port']),
 #       user=(data['DB_Path']['User']),
 #       password=(data['DB_Path']['Pass']),
 #       charset='WIN1252'
  #  )

    # Verbindung zur mysql Datenbankparameter
    myconn = pymysql.connect(
        user=(data['DB_mysql']['User']),
        password=(data['DB_mysql']['Pass']),
        host=(data['DB_mysql']['Server']),
        database=(data['DB_mysql']['Database'])
    )






    # Helfer_leistungen MD
    query: str = "SELECT leistungen.zeitraumid, leistungen.gesamtkgmitfaktor, leistungen.leistung, helfer_zeitraeume.helfernr, helfer_zeitraeume.betriebid \
     FROM leistungen \
     INNER JOIN helfer_zeitraeume ON  helfer_zeitraeume.zeitraumid=leistungen.zeitraumid \
     where helfer_zeitraeume.betriebid = '"+str(betriebid)+"' ORDER BY leistungen.leistung DESC LIMIT 20"
    print(query)


    #### Stunden summiern
    #query2: str = "SELECT ZEITRAUMID,Sum(GesamtStunden) As GesamtStunden FROM ( Select tLB.ZeitraumID, Sum(tLB.STUNDEN) As GesamtStunden From Lohnbuchungen tLB Left Join Taetigkeiten tT On tLB.TAETIGKEITID = tT.ID group by tLB.ZEITRAUMID, tT.BUCHUNGSART, tT.BONUSBERECHNUNG, tLB.Datum, BUCHUNGS_STATUS_ID having tT.BUCHUNGSART = 1 And tT.BONUSBERECHNUNG = 1  And tLB.Datum Between '01.08.2021' And '11.08.2021' ) group by ZEITraumid"

    # Verbindung zur MYSQL aufbauen
    mysql = myconn.cursor()

    # excecute query
    mysql.execute(query)

    result = mysql.fetchall()
    #print(result[0])
    for row in result:
        print (row[3], row[2])




    #([hzid, gesamtkgmf, leistung, helfernr, betriebid]) = mysql

    #for row in mysql:
     #   short = row
      #  (hzid, gesamtkgmf, leistung, helfernr, betriebid) = row
      #  print(short)
      #  print(hzid)
       # print(gesamtkgmf)
       # print(leistung)

    plt.title("Top 20 Pflücker")
    plt.bar(result[3], result[2])
    plt.xlabel('Helfernummer')
    plt.ylabel('kg/Std')


    plt.show()


    myconn.commit()


    myconn.close()


Es wäre echt nett wenn mir jemand den entscheidenen Tip geben könnte :-)
cbesi
User
Beiträge: 41
Registriert: Dienstag 11. August 2020, 22:04

Hallo Gemeinde :-)

und wieder einmal konnte ich es selber lösen.

Falls aber jemand vor dem gleichen Problem steht, es war ganz einfach:

Code: Alles auswählen

   # excecute query
    mysql.execute(query)
    leistung = []
    helfernr = []
    result = mysql.fetchall()
    #print(result[0])
    for row in result:
        print (row[3], row[2])
        leistung.append(int(row[2]))
        helfernr.append(str(row[3]))
Sirius3
User
Beiträge: 17822
Registriert: Sonntag 21. Oktober 2012, 17:20

Die Funktion `visu` ist viel zu lang und hat auch viel zu viele Leerzeilen, als dass sie gut lesbar wäre.
Funktionen sollten wie Variablennamen aussagekräftig sein und keine Abkürzungen enthalten.
`myconn` hieße dann `database`, und `mysql` `cursor`.
Man versucht, Wiederholungen zu vermeiden, ´data['DB_mysql']` wiederholt sich sehr oft. Die Klammern drumrum sind überflüssig.
Auch Konfigurationsdateien sollten sprechende Schlüssel haben: `Pass` -> `Password`?
Dass `query` ein String ist, sieht jeder sofort, da ist die Typannotation komplett unsinnig.
In SQL-Statements formatiert man niemals Parameter in den String hinein, dafür gibt es Platzhalter!
Wenn Du nur row[3] und row[2] brauchst, warum fragst Du dann viel mehr ab?
Die Typen in der Datenbank sollten schon richtig sein, und man sollte die nicht extra umwandeln müssen.

Code: Alles auswählen

import json
import pymysql
import matplotlib.pyplot as plt
from contextlib import closing

def connect_to_database():
    with open('db.json', encoding="utf8") as json_file:
        data = json.load(json_file)['DB_mysql']

    return pymysql.connect(
        user=data['User'],
        password=data['Pass'],
        host=data['Server'],
        database=data['Database'],
    )

def visualisieren(betrieb_id):
    with closing(connect_to_database()) as database:

        query = """SELECT helfer_zeitraeume.helfernr, leistungen.leistung
            FROM leistungen INNER JOIN helfer_zeitraeume ON  helfer_zeitraeume.zeitraumid=leistungen.zeitraumid
            WHERE helfer_zeitraeume.betriebid = %s ORDER BY leistungen.leistung DESC LIMIT 20"""

        with closing(database.cursor()) as cursor:
            cursor.execute(query, [betrieb_id])
            result = cursor.fetchall()
        
    helfer_nummer, leistung = zip(*result)
    plt.title("Top 20 Pflücker")
    plt.bar(helfer_nummer, leistung)
    plt.xlabel('Helfernummer')
    plt.ylabel('kg/Std')

    plt.show()
Antworten