MySQL und Python: Unterschied zwischen den Versionen

Aus CyberWiki
Zur Navigation springen Zur Suche springen
Keine Bearbeitungszusammenfassung
 
(20 dazwischenliegende Versionen desselben Benutzers werden nicht angezeigt)
Zeile 2: Zeile 2:
Zuerst müssen wir den MySQL Server und die Python-Module für den Datenbankzugriff installieren.
Zuerst müssen wir den MySQL Server und die Python-Module für den Datenbankzugriff installieren.
  sudo apt-get install mysql-server python-mysqldb
  sudo apt-get install mysql-server python-mysqldb
Danach legen wir eine Datenbank ''sensor'' an:
Danach legen wir eine '''Datenbank sensor''' an:
  $ mysql -u root -p
  $ mysql -u root -p
  Enter password:
  Enter password:
Zeile 9: Zeile 9:
Jetzt legen wir einen User account für diese Datenbank an und vergeben die Zugriffsrecht. ''password'' ist unser gewünschtes Passwort.
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> CREATE USER 'pi'@'localhost' IDENTIFIED BY 'password';
  mysql> GRANT ALL PRIVILEGES ON temps.* TO 'pi'@'localhost';
  mysql> GRANT ALL PRIVILEGES ON sensor.* TO 'pi'@'localhost';
  mysql> FLUSH PRIVILEGES;
  mysql> FLUSH PRIVILEGES;
  mysql> quit
  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:<br />
'''Tabelle: werte'''
id        9999999999 int(10)      auto_increment
utc      9999999999 int(10)
timestamp JJMMTTHHMM char(10)
temp      -99.9      decimal(3,1)  (Temperatur C)
hum      99.9      decimal(3,1)  (Luftfeuchtigkeit %)
humraw    99.9      decimal(3,1)  (Luftfeuchtigkeit % unkorrigiert)
hpa      9999.9    decimal(5,1)  (Luftdruck hpa)
tempint  -99.9      decimal(3,1)  (Interne Gehäusetemperatur)
'''Tabelle: hochtief'''
id        9999999999 int(10)      auto_increment
timestamp JJMMTT    char(6)
temph    -99.9      decimal(3,1)  (hoch Temperatur C)
tempt    -99.9      decimal(3,1)  (tief Temperatur C)
humh      999.9      decimal(4,1)  (hoch Luftfeuchtigkeit %)
humt      999.9      decimal(4,1)  (tief Luftfeuchtigkeit %)
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(3,1),
    ...
);
create table hochtief (
    timestamp char(6),
    temp1h decimal(3,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.
==Mit Tabellen arbeiten==
Tabelle leeren:
mysql> delete from ''tabelle'';
Tabelle leeren und Autoincrementwert zurücksetzen:
mysql> truncate table ''tabelle'';
Hier wird die gesamte Tabelle gelöscht und neu aufgebaut. Das geht bei großen Tabellen auch schneller.

Aktuelle Version vom 23. Januar 2019, 17:34 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

id        9999999999 int(10)       auto_increment
utc       9999999999 int(10)
timestamp JJMMTTHHMM char(10)
temp      -99.9      decimal(3,1)  (Temperatur C)
hum       99.9       decimal(3,1)  (Luftfeuchtigkeit %)
humraw    99.9       decimal(3,1)  (Luftfeuchtigkeit % unkorrigiert)
hpa       9999.9     decimal(5,1)  (Luftdruck hpa)
tempint   -99.9      decimal(3,1)  (Interne Gehäusetemperatur)

Tabelle: hochtief

id        9999999999 int(10)       auto_increment
timestamp JJMMTT     char(6)
temph     -99.9      decimal(3,1)  (hoch Temperatur C)
tempt     -99.9      decimal(3,1)  (tief Temperatur C)
humh      999.9      decimal(4,1)  (hoch Luftfeuchtigkeit %)
humt      999.9      decimal(4,1)  (tief Luftfeuchtigkeit %)
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(3,1),
    ...
);
create table hochtief (
    timestamp char(6),
    temp1h decimal(3,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.

Mit Tabellen arbeiten

Tabelle leeren:

mysql> delete from tabelle;

Tabelle leeren und Autoincrementwert zurücksetzen:

mysql> truncate table tabelle;

Hier wird die gesamte Tabelle gelöscht und neu aufgebaut. Das geht bei großen Tabellen auch schneller.