MySQL und Python: Unterschied zwischen den Versionen

Aus CyberWiki
Zur Navigation springen Zur Suche springen
Keine Bearbeitungszusammenfassung
Zeile 15: Zeile 15:


==Tabellen definieren==
==Tabellen definieren==
Für die Speicherung der Sensorwerte benötigen wir zwei Tabellen. In die erste (werte) schreiben wir die 5-Minuten-Daten der Sensoren und in der zweiten (hochtief) sollen die Maxima bzw. Minima Platz finden. Die Tabellen haben folgenden Aufbau:<br />
Für die Speicherung der Sensorwerte benötigen wir zwei Tabellen. In die erste (werte) schreiben wir die 5-Minuten-Daten der Sensoren und in der zweiten (hochtief) sollen die Maxima bzw. Minima Platz finden. Die Tabellen haben folgenden Aufbau. Dabei bedeutet (3,1) 3 Stellen, davon 1 Nachkommastelle, das Vorzeichen muss nicht berücksichtigt werden:<br />
'''Tabelle: werte'''
'''Tabelle: werte'''
  timestamp JJMMTTHHMM char(10)
  timestamp JJMMTTHHMM char(10)
  temp1    -99.9      decimal(2,1)  (Temperatur 1 C)
  temp1    -99.9      decimal(3,1)  (Temperatur 1 C)
  temp2    -99.9      decimal(2,1)  (Temperatur 2 C)
  temp2    -99.9      decimal(3,1)  (Temperatur 2 C)
  hum1      999.9      decimal(3,1)  (Luftfeuchtigkeit 1 %)
  hum1      999.9      decimal(4,1)  (Luftfeuchtigkeit 1 %)
  hum2      999.9      decimal(3,1)  (Luftfeuchtigkeit 2 %)
  hum2      999.9      decimal(4,1)  (Luftfeuchtigkeit 2 %)
  hpa      9999.9    decimal(4,1)  (Luftdruck hpa)
  hpa      9999.9    decimal(5,1)  (Luftdruck hpa)
'''Tabelle: hochtief'''
'''Tabelle: hochtief'''
  timestamp JJMMTT    char(6)
  timestamp JJMMTT    char(6)
  temp1h    -99.9      decimal(2,1)  (hoch Temperatur 1 C)
  temp1h    -99.9      decimal(3,1)  (hoch Temperatur 1 C)
  temp1t    -99.9      decimal(2,1)  (tief Temperatur 1 C)
  temp1t    -99.9      decimal(3,1)  (tief Temperatur 1 C)
  temp2h    -99.9      decimal(2,1)  (hoch Temperatur 2 C)
  temp2h    -99.9      decimal(3,1)  (hoch Temperatur 2 C)
  temp2t    -99.9      decimal(2,1)  (tief Temperatur 2 C)
  temp2t    -99.9      decimal(3,1)  (tief Temperatur 2 C)
  hum1h    999.9      decimal(3,1)  (hoch Luftfeuchtigkeit 1 %)
  hum1h    999.9      decimal(4,1)  (hoch Luftfeuchtigkeit 1 %)
  hum1t    999.9      decimal(3,1)  (tief Luftfeuchtigkeit 1 %)
  hum1t    999.9      decimal(4,1)  (tief Luftfeuchtigkeit 1 %)
  hum2h    999.9      decimal(3,1)  (hoch Luftfeuchtigkeit 2 %)
  hum2h    999.9      decimal(4,1)  (hoch Luftfeuchtigkeit 2 %)
  hum2t    999.9      decimal(3,1)  (tief Luftfeuchtigkeit 2 %)
  hum2t    999.9      decimal(4,1)  (tief Luftfeuchtigkeit 2 %)
  hpah      9999.9    decimal(4,1)  (hoch Luftdruck hpa)
  hpah      9999.9    decimal(5,1)  (hoch Luftdruck hpa)
  hpat      9999.9    decimal(4,1)  (tief Luftdruck hpa)
  hpat      9999.9    decimal(5,1)  (tief Luftdruck hpa)
Diese Tabelle beinhaltet Datensätze mit folgenden Werten in timestamp:
Diese Tabelle beinhaltet Datensätze mit folgenden Werten in timestamp:
  JJ9999 - Jahres-Hoch-Tief-Werte
  JJ9999 - Jahres-Hoch-Tief-Werte

Version vom 6. Juli 2017, 16:00 Uhr

MySQL installieren und Datenbank anlegen

Zuerst müssen wir den MySQL Server und die Python-Module für den Datenbankzugriff installieren.

sudo apt-get install mysql-server python-mysqldb

Danach legen wir eine Datenbank sensor an:

$ mysql -u root -p
Enter password:
mysql> CREATE DATABASE sensor;
mysql> USE sensor;

Jetzt legen wir einen User account für diese Datenbank an und vergeben die Zugriffsrecht. password ist unser gewünschtes Passwort.

mysql> CREATE USER 'pi'@'localhost' IDENTIFIED BY 'password';
mysql> GRANT ALL PRIVILEGES ON sensor.* TO 'pi'@'localhost';
mysql> FLUSH PRIVILEGES;
mysql> quit

Hier wäre eine gute Gelegenheit, die MySQL-Datenbanken auf einen USB-Stick zu verschieben -> MySQL-Datenbank verschieben.

Tabellen definieren

Für die Speicherung der Sensorwerte benötigen wir zwei Tabellen. In die erste (werte) schreiben wir die 5-Minuten-Daten der Sensoren und in der zweiten (hochtief) sollen die Maxima bzw. Minima Platz finden. Die Tabellen haben folgenden Aufbau. Dabei bedeutet (3,1) 3 Stellen, davon 1 Nachkommastelle, das Vorzeichen muss nicht berücksichtigt werden:
Tabelle: werte

timestamp JJMMTTHHMM char(10)
temp1     -99.9      decimal(3,1)  (Temperatur 1 C)
temp2     -99.9      decimal(3,1)  (Temperatur 2 C)
hum1      999.9      decimal(4,1)  (Luftfeuchtigkeit 1 %)
hum2      999.9      decimal(4,1)  (Luftfeuchtigkeit 2 %)
hpa       9999.9     decimal(5,1)  (Luftdruck hpa)

Tabelle: hochtief

timestamp JJMMTT     char(6)
temp1h    -99.9      decimal(3,1)  (hoch Temperatur 1 C)
temp1t    -99.9      decimal(3,1)  (tief Temperatur 1 C)
temp2h    -99.9      decimal(3,1)  (hoch Temperatur 2 C)
temp2t    -99.9      decimal(3,1)  (tief Temperatur 2 C)
hum1h     999.9      decimal(4,1)  (hoch Luftfeuchtigkeit 1 %)
hum1t     999.9      decimal(4,1)  (tief Luftfeuchtigkeit 1 %)
hum2h     999.9      decimal(4,1)  (hoch Luftfeuchtigkeit 2 %)
hum2t     999.9      decimal(4,1)  (tief Luftfeuchtigkeit 2 %)
hpah      9999.9     decimal(5,1)  (hoch Luftdruck hpa)
hpat      9999.9     decimal(5,1)  (tief Luftdruck hpa)

Diese Tabelle beinhaltet Datensätze mit folgenden Werten in timestamp:

JJ9999 - Jahres-Hoch-Tief-Werte
JJMM99 - Monats-Hoch-Tief-Werte
JJMMTT - Tages-Hoch-Tief-Werte

Nun steigen wir mit dem neuen User in die Datenbank ein:

mysql -u pi -p
mysql> use sensor;

Mit create table werden die Datenfelder definiert (nach dem letzten Feld kein Komma!):

create table werte (
    timestamp char(10),
    temp1 decimal(2,1),
    ...
);
create table hochtief (
    timestamp char(6),
    temp1h decimal(2,1),
    ...
);

Sollen die Definitionen geändert werden kann man das mit dem Befehl "alter" vornehmen. Z.B.

alter table werte modify temp1 decimal(5,1);

Abschließend sollten noch ein primary Key und ein alternate Key hinzugefügt werden. Der folgende Befehl fügt ein Feld "id" mit dem Attribut auto_increment an erster Stelle hinzu (für beide Tabellen durchführen):

mysql> ALTER TABLE sensor.werte ADD COLUMN id int(10) UNSIGNED PRIMARY KEY AUTO_INCREMENT FIRST;

Das Feld timestamp machen wir mit folgendem Befehl zum alternate Key. Auch hier für beide Tabellen durchführen.

mysql> ALTER TABLE sensor.werte ADD INDEX timestamp (timestamp);

Indizes können entfernt werden mit

mysql> DROP INDEX timestamp ON sensor.werte;
mysql> SHOW INDEX FROM sensor.werte;

zeigt die verfügbaren Indizes und mit

mysql> describe hochtief;
mysql> describe werte;

können wir überprüfen, ob wir alles richtig gemacht haben.