Visualisierung

Installation und Anwendung von Datenbankschnittstellen wie SQLite, PostgreSQL, MariaDB/MySQL, der DB-API 2.0 und sonstigen Datenbanksystemen.
Antworten
michi
User
Beiträge: 4
Registriert: Donnerstag 28. Juni 2018, 09:16

Hallo,

ich bin gerade dabei mich in Python einzuarbeiten und daher ist vieles für mich noch relativ neu. Daher brauch ich eure Hilfe:
Ich habe eine Verbindung von Python zu einer SQL Datenbank erstellt. Nun möchte ich eine Spalte der Datenbank aufrufen und die Werte der Spalte in einem Diagramm ausgeben lassen. Ich habe eine Verbindung zur SQL Datenbank erstellt. Mein aktueller Code sieht so aus, jedoch scheint die Zeile mit: plt.plot(df.booking, df.distance) falsch zu sein.

Code: Alles auswählen

from sqlalchemy import create_engine
import pandas as pd
import matplotlib.pyplot as plt
conn_url = 'postgresql://{}:{}@{}:{}/{}'.format(
    'USERNAME', 'Password', 'HOST', 'PORT', 'DATABASE') //Verbindung zur SQL Datenbank
engine = create_engine(conn_url)
conn = engine.connect()
rs = conn.execute("SELECT * FROM DATABASE") //SQL Code
df = pd.DataFrame(rs.fetchall())
plt.plot(df.booking_id, df.distance)    //Visualisieren von ID auf x und Strecke auf y - Achse
plt.show()                              // Anzeigen des Diagramms
conn.close()                            // Schließen der Verbindung

Vielen Dank für eure Hilfe!!
Benutzeravatar
__blackjack__
User
Beiträge: 13004
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

Was heisst „scheint falsch zu sein“ denn genau? Explodiert die Maus? Macht die Katze komische Geräusche? Wird eine Ausnahme ausgelöst? Wenn ja welche? Bitte komplett mit Traceback. Oder was erwartest Du und was passiert stattdessen?
“Most people find the concept of programming obvious, but the doing impossible.” — Alan J. Perlis
michi
User
Beiträge: 4
Registriert: Donnerstag 28. Juni 2018, 09:16

Viele Dank für die schnelle Antwort!!
Also ich habe in SQL eine Datenbank und möchte Teile der Datenbank über Python ausgeben. Wie im oberen Code zu sehen, habe ich zunächst eine Verbindung zu SQL in Python erstellt, das klappt. Das Problem ist in den folgenden Zeilen, dass ich nicht weiß, wie ich eine Spalte einer Datenbank aufruf. Ich möchte z.B. die Spalte mit dem Namen 'ID' aus der Datenbank 'xyz' aufrufen und in eine Variable (= strecke) speichern. Geht das über eine Cursor folgendermaßen:

cursor.execute(SQL Befehl) //SQL Befehl wird an die Datenbank gesendet
row=cursor.fetchone() // über die Funktion wird der erste Datensatz gelesen und in row gespeichert
while (row!=None): // while schleife, solange bis keine Spalten mehr vorhanden sind
print(row[0])
row = cursor.fetchone()

Code: Alles auswählen

from sqlalchemy import create_engine
import mysql.connector
import pandas as pd
import matplotlib.pyplot as plt
conn_url = 'postgresql://{}:{}@{}:{}/{}'.format(
    '', '', '', '', '')
engine = create_engine(conn_url)
conn = engine.connect()
cursor = conn.cursor()
cursor.execute("SELECT * FROM xyz")
row = cursor.fetchone()
while (row != None):
    print(row[0])
    row = cursor.fetchone()

cursor.close()
conn.disconnect()
Es wird folgender Fehler immer angezeigt:

Traceback (most recent call last):
File "/Users/Michi/PycharmProjects/Test/TestScript.py", line 10, in <module>
cursor = conn.cursor()
AttributeError: 'Connection' object has no attribute 'cursor'

Process finished with exit code 1
Benutzeravatar
__blackjack__
User
Beiträge: 13004
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

Das sieht alles eher nach Raten als nach Programmieren aus. Die Ausnahme macht ja auch Sinn, denn wie kommst Du denn darauf das `Connection`-Objekte von SQLAlchemy eine `cursor()`-Methode haben?

Und was soll der Import von `mysql.connector` wenn Du auf eine PostgreSQL-Datenbank zugreifen willst?

Wenn man keine Verbindungen, zum Beispiel für Transaktionen braucht, kann man die `execute()`-Methode von `engine` verwenden. Ansonsten die auf einer `Connection` und am die dann am Ende schliessen und gegebenfalls zwischendurch `commit()` wenn Änderungen permanent gemacht werden sollen.

Bei dem SQL solltest Du anstelle des ``*`` besser explizit hin schreiben was Du in welcher Reihenfolge haben möchtest. Der Leser sieht das an der Stelle, es ist robuster gegen Änderungen am Schema, und Du überträgst keine unnötigen Daten.

Wie man an die Werte in den Spalten in einer Schleife kommt, steht in der SQLAlchemy-Dokumnetation, die ziemlich umfangreich ist, nicht nur Referenzdokumentation enthält, und voller Beispiele ist.

http://docs.sqlalchemy.org/en/latest/co ... asic-usage
“Most people find the concept of programming obvious, but the doing impossible.” — Alan J. Perlis
michi
User
Beiträge: 4
Registriert: Donnerstag 28. Juni 2018, 09:16

Ok vielen Dank für die Antwort und für den Link zur SQLAIchemy Dokumentation. Ich bin jetzt auch schon bisschen schlauer. Ich hab eine Verbindung zur Datenbank über die engine Methode, anschließend die SQL Abfrage gespeichert in ein DataFrame. Sieht folgendermaßen aus:

Code: Alles auswählen

from sqlalchemy import create_engine
import pandas as pd
conn_url = 'postgresql://{}:{}@{}:{}/{}'.format(
    '', '', '', '', '')
engine = create_engine(conn_url)
with engine.connect() as conn:
    result = conn.execute("SELECT booking_id, distance FROM beezero.bookings")
dataframe = pd.DataFrame(result.fetchall())
dataframe.columns = result.keys()
print(dataframe)
Jetzt möchte ich noch die Werte von meiner SQL Abfrage in einem Diagramm darstellen, also booking_id und distance.
Ich muss nun das matplotlib importieren, blos wie mache ich weiter? Wie kann ich meine Werte aus SQL abfragen?
Sirius3
User
Beiträge: 17711
Registriert: Sonntag 21. Oktober 2012, 17:20

Ein `fetchall` nachdem die Connection schon wieder geschlossen ist, ist wohl falsch. Und die Frage verstehe ich nicht, da Du die Werte ja schon in einem DataFrame hast.
michi
User
Beiträge: 4
Registriert: Donnerstag 28. Juni 2018, 09:16

Vielen Dank für die ganzen Hilfen von euch, ich habs hinbekommen :P
Antworten