Ich möchte mein eher bescheidenes Python-Repertoire auf SQL Datenbanken ausweiten bzw. konkret möchte ich Daten direkt aus einer Datenbank ziehen und nicht den Umweg über eine CSV Datei gehen. Nun habe ich unsere IT überredet, dass sie mir einen Benutzer mit Lesezugriff auf eine unserer Datenbanken gewährt. Somit kann ich mir das zumindest mal in Ruhe an einem Realen Beispiel anschauen.
Bei der Datenbank handelt es sich um eine MSSQL Datenbank, mit mehreren Datenloggern die in unterschiedlichen Intervallen Messdaten, wie Temperatur oder Luftfeuchte aufzeichnen. Ich habe erfolgreich eine Verbindung aufgebaut (cnxn) und einen Cursor erstellt (cursor). Ich hab eine Liste aller Tabellen der Datenbank erstellt und in Strings umformatiert. Weiters hab ich eine Möglichkeit gefunden in alle Tabellen rein zu schauen. Anbei der Code den ich hierfür verwendet habe.
Code: Alles auswählen
#Connection
cnxn = pyodbc.connect('DRIVER={SQL Server};SERVER='+server+';DATABASE='+database+';UID='+username+';PWD='+ password)
#Cursor = ~Zugriff
cursor = cnxn.cursor()
#sql = ~Anfrage; Code der von der Datenbank ausgeführt wird
sql = "SELECT Distinct TABLE_NAME FROM information_schema.TABLES"
#Zugriff auf die Datenbank - Liste aller Tabellen in der Datenbank erstellen
cursor.execute(sql)
tab = cursor.fetchall()
#in tab sind die Einträge 'pyodbc.Row', hiernach 'String'
import re
listen = []
for k in tab:
x = str(k)
listen += [re.sub(r'[^a-zA-Z]', '', x)]
#sql bauen um sich in der Datenbank um zu sehen
was = '*'
vonwo = listen[4]
sql = "SELECT "+was+" FROM "+vonwo
#Zugriff mit Pandas
import pandas as pd
test = pd.read_sql(sql, cnxn)
* dass es in der Datenbank 47 Tabellen gibt, 2 davon Sys und 6 davon cdc, diese 8 konnte ich nicht anschauen.
* dass eine Tabelle "DataPoints" heißt und vermutlich die Datenlogger sind. Hiervon würde ich gerne genau einen auswählen.
* dass eine Tabelle "pointValue" heißt. Diese scheint zu groß für "fetchall()", aber mit fetchone() wurden 5 Werte gefunden, mit fetchval() wurde einer dieser 5 gefunden.
Meine Fragen sind:
* Gehe ich recht in der Annahme, dass die einzelnen Tabellen der Datenbank über eine gemeinsame Spalte verknüpft werden können? Beispielsweise hat "DataPoints" eine Spalte "ID" und ich hoffe nun, dass "pointValue" eine Spalte "DataPointID" hat.
* Wie kann ich mir die Spaltenüberschriften der Tabelle "pointValue" anschauen?
* Wie schreibe ich ein Querry (ein SQL), welches die Tabellen "DataPoints" und "pointValue" so kombiniert, dass ich die Messwerte von einem logger bekomme
* Bonus Frage, dass ganze würde ich dann noch gern auf einen Zeitraum beschränken
Ich hoffe ich konnte mein Anliegen etwas klar darstellen und das jemand die Muse hat mir zu helfen

Vielen Dank
Tob
ps.: bitte lasst mich wissen, wenn ich wichtige (oder interessante) Fakten vergessen hab an zu geben
