ubuntuusers.de

Python Daten in InfluxDB schreiben

Status: Gelöst | Ubuntu-Version: Kein Ubuntu
Antworten |

tassilomoedl

(Themenstarter)

Anmeldungsdatum:
27. Juli 2022

Beiträge: 77

karzer schrieb:

tassilomoedl schrieb:

Es geht, aber in der Datenbank wird nichts gespeichert!

Wie hast du das herausgefunden? Gibt das Programm True aus?

Nein, tut es nicht.

Zum Test einfach mal am Ende des Programms das einfügen:

client.get_list_database()

Habe ich gemacht. Es gibt nichts aus.

noisefloor Team-Icon

Anmeldungsdatum:
6. Juni 2006

Beiträge: 29567

Hallo,

dann legst du auch gar keine DB an.

Gruß, noisefloor

karzer Team-Icon

Wikiteam
Avatar von karzer

Anmeldungsdatum:
10. April 2022

Beiträge: 1565

Wohnort: Bad Oeynhausen

tassilomoedl schrieb:

noisefloor schrieb:

Und Fehlermeldungen kannst du hier in einem Codeblock posten statt im Paste-Service. Ist einfacher.

Aber die Fehlermeldung ist so lang und würde den Thread unnötig aufblähen!

noisefloor hat Recht. Ich würde dem Post einfach die letzte Zeile der Fehlermeldung hinzufügen, die ist sowieso am Aussagekräftigsten, bspw.:

TypeError: 'int' object is not iterable

noisefloor schrieb:

Hallo,

dann legst du auch gar keine DB an.

Gruß, noisefloor

Das kann nicht sein, das create_database() Modul wird eindeutig aufgerufen, ebenso wie das switch_database().

@tassilomoedl

Bitte das hier versuchen & Ausgabe posten:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
from influxdb import InfluxDBClient

json_body = [
    {
        "irgendwas": 123456
     }
]

client = InfluxDBClient(host='localhost', port=8086)
client.create_database('test')
client.get_list_database() 
client.switch_database('test') 
client.write_points(json_body)

# client.get_list_database() 

Das sollte alle Vorhandenen DBs ausgeben.

noisefloor Team-Icon

Anmeldungsdatum:
6. Juni 2006

Beiträge: 29567

Hallo,

Das kann nicht sein, das create_database() Modul wird eindeutig aufgerufen, ebenso wie das switch_database()

Theoretisch, praktisch wissen wir nicht, welche Code der TE _wirklich_ ausführt. Die Bereitschaft, ein paar mehr Infos zu liefern, ist ja eher dünn bis dato.

Gruß, noisefloor

seahawk1986

Anmeldungsdatum:
27. Oktober 2006

Beiträge: 11265

Wohnort: München

karzer schrieb:

1
2
3
4
5
json_body = [
    {
        "irgendwas": 123456
     }
]

Das wird zu keinem brauchbaren Eintrag in der Datenbank führen - ein Datenpunkt hat üblicherweise einen Namen für das "measurement", ein Dictionary aus tags (Mapping[str, str]), die eine Unterscheidung von verschiedenen Clients/Messstationen erlauben, die Werte in die selbe Datenbank schreiben, einen (optionalen) Zeitstempel und ein Dictionary, das die Sensornamen und die dazugehörigen Messwerte enthält - außerdem sollte man nicht vergessen die Datenbankverbindung zu schließen - also z.B.:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
import random
import datetime

from contextlib import closing
from typing import List, Mapping, Optional

from influxdb import InfluxDBClient

DATABASE = "test"

random.seed()

with closing(InfluxDBClient(host='localhost', port=8086)) as client:
    existing_databases = client.get_list_database()
    print(f"Existing Databases: {existing_databases}")
    if not any(d for d in existing_databases if d['name'] == DATABASE):
        print(f"DB {DATABASE} does not exist, creating it...")
        client.create_database(DATABASE)
    client.switch_database(DATABASE)

    p = {
        "measurement": "sensor",
        "tags": {"name": "test", "location": "does not matter"},
        "time": datetime.datetime.now().isoformat(),
        "fields": {
            "Sensor1": random.uniform(0, 255),
            "Sensor2": random.uniform(-1024, 1024),
        }
    }
    client.write_points([p])
    result = client.query('select Sensor1, Sensor2 from sensor;')
    print(*p, sep=';')
    for p in result['sensor']:
        print(*p.values(), sep=';')

tassilomoedl

(Themenstarter)

Anmeldungsdatum:
27. Juli 2022

Beiträge: 77

Bitte das hier versuchen & Ausgabe posten:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
from influxdb import InfluxDBClient

json_body = [
    {
        "irgendwas": 123456
     }
]

client = InfluxDBClient(host='localhost', port=8086)
client.create_database('test')
client.get_list_database() 
client.switch_database('test') 
client.write_points(json_body)

# client.get_list_database() 

Das sollte alle Vorhandenen DBs ausgeben.

Es gibt aber gar keine Fehlermeldung, sondern einfach GAR KEINEN OUTPUT.

tassilomoedl

(Themenstarter)

Anmeldungsdatum:
27. Juli 2022

Beiträge: 77

seahawk1986 schrieb:

karzer schrieb:

1
2
3
4
5
json_body = [
    {
        "irgendwas": 123456
     }
]

Das wird zu keinem brauchbaren Eintrag in der Datenbank führen - ein Datenpunkt hat üblicherweise einen Namen für das "measurement", ein Dictionary aus tags (Mapping[str, str]), die eine Unterscheidung von verschiedenen Clients/Messstationen erlauben, die Werte in die selbe Datenbank schreiben, einen (optionalen) Zeitstempel und ein Dictionary, das die Sensornamen und die dazugehörigen Messwerte enthält - außerdem sollte man nicht vergessen die Datenbankverbindung zu schließen - also z.B.:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
import random
import datetime

from contextlib import closing
from typing import List, Mapping, Optional

from influxdb import InfluxDBClient

DATABASE = "test"

random.seed()

with closing(InfluxDBClient(host='localhost', port=8086)) as client:
    existing_databases = client.get_list_database()
    print(f"Existing Databases: {existing_databases}")
    if not any(d for d in existing_databases if d['name'] == DATABASE):
        print(f"DB {DATABASE} does not exist, creating it...")
        client.create_database(DATABASE)
    client.switch_database(DATABASE)

    p = {
        "measurement": "sensor",
        "tags": {"name": "test", "location": "does not matter"},
        "time": datetime.datetime.now().isoformat(),
        "fields": {
            "Sensor1": random.uniform(0, 255),
            "Sensor2": random.uniform(-1024, 1024),
        }
    }
    client.write_points([p])
    result = client.query('select Sensor1, Sensor2 from sensor;')
    print(*p, sep=';')
    for p in result['sensor']:
        print(*p.values(), sep=';')

Es gibt keine Fehlermeldung, aber die Daten werden nicht gespeichert!

seahawk1986

Anmeldungsdatum:
27. Oktober 2006

Beiträge: 11265

Wohnort: München

Was für eine Version von InfluxDB nutzt du denn genau und auf was für einem System läuft die? Du hast ja "Kein Ubuntu" angegeben...

noisefloor Team-Icon

Anmeldungsdatum:
6. Juni 2006

Beiträge: 29567

Hallo,

welche Ausgage generiest das Skript bei dir? "Keine" kann nicht sein, wenn das Skript durchläuft.

Gruß, noisefloor

tassilomoedl

(Themenstarter)

Anmeldungsdatum:
27. Juli 2022

Beiträge: 77

noisefloor schrieb:

Hallo,

welche Ausgage generiest das Skript bei dir? "Keine" kann nicht sein, wenn das Skript durchläuft.

Gruß, noisefloor

Existing Databases: [{'name': '_internal'}, {'name': 'test'}]
measurement;tags;time;fields
2022-08-29T10:08:11.174540Z;222.01423911509576;-700.9048188628756
2022-08-29T10:14:56.790408Z;26.183567343144123;527.391469238546
2022-08-29T10:16:10.474016Z;18.105307342508492;117.91126937621289
2022-08-29T10:16:29.762147Z;82.55279138791762;668.68087859571
2022-08-29T10:57:27.086399Z;250.5786769320449;270.2186235637282
2022-08-29T10:57:28.782424Z;6.649076682399119;-901.627707018037
2022-08-29T10:57:30.281930Z;223.07176814070775;-704.8058677235358

seahawk1986

Anmeldungsdatum:
27. Oktober 2006

Beiträge: 11265

Wohnort: München

Na dann existiert die Datenbank (und wurde bei dem Durchlauf auch nicht neu angelegt) und es gibt gespeicherte Werte von den 6 früheren Aufrufen des Skripts.

tassilomoedl

(Themenstarter)

Anmeldungsdatum:
27. Juli 2022

Beiträge: 77

OK! Danke!

karzer Team-Icon

Wikiteam
Avatar von karzer

Anmeldungsdatum:
10. April 2022

Beiträge: 1565

Wohnort: Bad Oeynhausen

seahawk1986 schrieb:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
import random
import datetime

from contextlib import closing
from typing import List, Mapping, Optional

from influxdb import InfluxDBClient

DATABASE = "test"

random.seed()

with closing(InfluxDBClient(host='localhost', port=8086)) as client:
    existing_databases = client.get_list_database()
    print(f"Existing Databases: {existing_databases}")
    if not any(d for d in existing_databases if d['name'] == DATABASE):
        print(f"DB {DATABASE} does not exist, creating it...")
        client.create_database(DATABASE)
    client.switch_database(DATABASE)

    p = {
        "measurement": "sensor",
        "tags": {"name": "test", "location": "does not matter"},
        "time": datetime.datetime.now().isoformat(),
        "fields": {
            "Sensor1": random.uniform(0, 255),
            "Sensor2": random.uniform(-1024, 1024),
        }
    }
    client.write_points([p])
    result = client.query('select Sensor1, Sensor2 from sensor;')
    print(*p, sep=';')
    for p in result['sensor']:
        print(*p.values(), sep=';')

Wozu brauchst Du denn List, Mapping und Optional ?

seahawk1986

Anmeldungsdatum:
27. Oktober 2006

Beiträge: 11265

Wohnort: München

karzer schrieb:

Wozu brauchst Du denn List, Mapping und Optional ?

Die können raus, ich hatte das ursprünglich mit pydantic-Modellen gemacht und vergessen die Zeile zu entfernen.

Antworten |