Wert der aktuellen Stunde zuweisen

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
sunshineh
User
Beiträge: 22
Registriert: Dienstag 3. Januar 2017, 11:21

Hallo

ich möchte mit Python die Stunde der Variable "temptime' in eine andere Variable abspeicher. Dies soll gleichzeitig auch der Name der Spalte meiner SQLite Tabelle sein.

Wie stell ich das am Besten an?
Benutzeravatar
__blackjack__
User
Beiträge: 13069
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@sunshineh: Was ist denn das Problem dabei?
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
sunshineh
User
Beiträge: 22
Registriert: Dienstag 3. Januar 2017, 11:21

Ich mach es nun so:
column = "c"+str(datetime.datetime.now().strftime("%H))

Nur wie bekommt ich in meinen SQLite Command nun diese Variable?
So klappt es jedenfalls nicht:

Code: Alles auswählen

sql_command = """ UPDATE tabname SET ? = ? +1 WHERE sensor  = 'PIR1',column, column
Benutzeravatar
__blackjack__
User
Beiträge: 13069
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@sunshineh: Gar nicht würde ich sagen. Wenn man ”variable” Spaltennamen hat, ist das üblicherweise ein Zeichen für einen nicht so tollen Datenbankentwurf. Die Stunde ist offensichtlich etwas variables und nichts statisches, also würde man das als *eine* Spalte definieren und nicht als Spalte pro Stunde. Man hat dann einen Tabelleneintrag pro Stunde. Oder besser noch einen Eintrag pro Messung mit Zeitstempel. Später alles nach Stunden gruppieren und zusammen zu rechnen ist ja gerade eine der Stärken von Datenbanken.
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
sunshineh
User
Beiträge: 22
Registriert: Dienstag 3. Januar 2017, 11:21

Danke für die Info. Aber grundsätzlich möchte ich das schon so, eben für jede Stunde eine eigene Spalte.

Nur weiß ich nicht, wie ich die Variable in mein SQL Command bekomme

Folgendes geht nicht ;-)

Code: Alles auswählen

sql_command = "UPDATE tabname SET ? = ? + 1 WHERE Sensor = 'PIR1' AND DayOfWeek = '1,2,3,4,5' "
cursor.execute(sql_command,(column,column))
Als Meldung erhalte ich folgendes:
cursor.execute(sql_command,(,(column,column))
splite 3.OperationalError: near "?": syntax error
Benutzeravatar
__blackjack__
User
Beiträge: 13069
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@sunshineh: Platzhalter sind für Werte und Spaltennamen sind keine Werte. Der Wert für `DayOfWeek` sieht auch komisch aus.
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
sunshineh
User
Beiträge: 22
Registriert: Dienstag 3. Januar 2017, 11:21

Wie kann ich dann den Wert in den Spaltenname verwandeln? Die Variable "DayOfWeek" soll einfach zur ein Info-String sein.
Sirius3
User
Beiträge: 17737
Registriert: Sonntag 21. Oktober 2012, 17:20

@sunshineh: auch wenn es Dir im Moment so vorkommt, dass die Stunde als Spaltenname eine gute Idee ist, beschreib doch mal Deine Aufgabe, was Du vorhast, aber nicht, wie Du denkst, dass es zu lösen wäre.
Benutzeravatar
__blackjack__
User
Beiträge: 13069
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@sunshineh: Statt die Stunden + Anzahl in Spalten zu kodieren, würde man die zum Beispiel so in einer eigenen Tabelle erfassen.

Code: Alles auswählen

CREATE TABLE sensor (
  id INTEGER PRIMARY KEY,
  "name" CHAR(10) NOT NULL,
  day_of_week CHAR(16) NOT NULL,
  CONSTRAINT sensor_con_1 UNIQUE ("name", day_of_week)
);

CREATE TABLE hour_counter (
  id INTEGER PRIMARY KEY,
  sensor_id INTEGER NOT NULL REFERENCES sensor (id),
  "hour" INTEGER NOT NULL CHECK ("hour" BETWEEN 0 AND 23),
  "count" INTEGER NOT NULL DEFAULT 0 CHECK ("count" >= 0),
  CONSTRAINT measurement_con_1 UNIQUE (sensor_id, "hour")
);
Wobei ich wie gesagt statt der `hour_counter`-Tabelle eher die Ereignisse mit einem Zeitstempel aufzeichnen würde. Aggregieren kann man später immer noch:

Code: Alles auswählen

CREATE TABLE "event" (
  id INTEGER PRIMARY KEY,
  sensor_id INTEGER NOT NULL REFERENCES sensor (id),
  "timestamp" TIMESTAMP NOT NULL DEFAULT (NOW)
);
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
Antworten