Insert Data Python zu InfluxDB

Installation und Anwendung von Datenbankschnittstellen wie SQLite, PostgreSQL, MariaDB/MySQL, der DB-API 2.0 und sonstigen Datenbanksystemen.
Antworten
yokay
User
Beiträge: 26
Registriert: Mittwoch 15. August 2018, 13:50

Hallo miteinander,

ich versuche gerade Daten in InfluxDB durch python hinzuzufügen, es funktioniert soweit auch alles recht gut bis "write_points" und dann bekomme ich folgende Fehlermeldung:

"ValueError: Invalid time precision is given. (use 'n', 'u', 'ms', 's', 'm' or 'h')"

Hat jemand eine Idee? Ich bedanke mich im voraus :)

Mein Code:

import random
from influxdb import InfluxDBClient
batch_size = 1000

test_client = InfluxDBClient("server", port, "user", "pw", "database")

def generate_rndnr():

points = []

for _ in range(batch_size):
points.append(random.randint(1, 1000))

return points

points= generate_rndnr()

test_client.write_points(points, "measurement", time_precision=None)
Sirius3
User
Beiträge: 17711
Registriert: Sonntag 21. Oktober 2012, 17:20

@yokay: wie lautet denn der wirkliche Code und der komplette Traceback? Im Moment gibst Du dem Parameter `time_precision` zwei Werte, "measurement" und None, die Fehlermeldung die Du bekommst ist daher ein TypeError.
yokay
User
Beiträge: 26
Registriert: Mittwoch 15. August 2018, 13:50

danke für deine Antwort Sirius3,

Hier der wirkliche Code:

import random
from influxdb import InfluxDBClient

batch_size = 1000
new_point = []
test_client = InfluxDBClient("host", port, "user", "pw", "database")
print ("Opened database successfully")
def generate_rndnr(pythoninfluxdb):

points = []

for _ in range(batch_size):
points.append(random.randint(1, 1000))

return points

fake_point= generate_rndnr("test")

test_client.write_points(fake_point, "test")
test_client.write_points(fake_point, "test", tags=None, tag_columns=None, field_columns=None, time_precision=None, database=None, retention_policy=None, batch_size=None, protocol=u'line', numeric_precision=None)
Benutzeravatar
__blackjack__
User
Beiträge: 13004
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@yokay: Immer noch das gleiche Problem: 'test' ist kein gültiger Wert für das `time_precision`-Argument.
“Most people find the concept of programming obvious, but the doing impossible.” — Alan J. Perlis
Benutzeravatar
__blackjack__
User
Beiträge: 13004
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

So wirklich der wirkliche Code kann das auch nicht sein, denn das fällt ziemlich am Anfang wegen `port` mit einem `NameError` auf die Nase.

Weitere Anmerkungen: `new_point` wird nirgends verwendet. `fake_point` sollte eher `fake_points` heissen.

Auf Modulebene sollte nur Code stehen der Konstanten, Funktionen, und Klassen definiert. Das Hauptprogramm steht üblicherweise in einer Funktion die `main()` heisst, und nur aufgerufen werden sollte wenn das Modul als Programm ausgeführt wird, aber nicht wenn man es importiert.

Variablen und Code auf Modulebene ist ja schon nicht gut, aber dann auch noch Funktionsdefinitionen mitten rein zu schreiben wird ganz schnell *sehr* unübersichtlich. Und damit fehleranfällig

Kryptische Abkürzungen wie `rndnr` sollte man nicht verwenden. Namen sollten dem Leser vermitteln was die Werte dahinter bedeuten, und keine Fragezeichen beim Lesen hinterlassen.

Die Funktion bekommt ein Argument das überhaupt nicht verwendet wird.

Um die Punkte zu erzeugen bietet sich eine „list comprehension“ an. Dann ist die Funktion ein Einzeiler.

Wenn man das Problem mit der `time_precision` gelöst hat, gibt es dort beim zweiten Aufruf Argumente die es bei der Methode gar nicht gibt: `numeric_precision`, `field_columns`, und `tag_columns`. Wo hast Du die her?

Bis auf `protocol` übergibst Du bei allen anderen (gültigen) Schlüsselwort-Argumenten den Defaultwert. Die kann man also auch alle weglassen.

Ungetestet:

Code: Alles auswählen

import random

from influxdb import InfluxDBClient
 
BATCH_SIZE = 1000

def generate_random_points():
    return [random.randint(1, 1000) for _ in range(BATCH_SIZE)]


def main():
    test_client = InfluxDBClient.from_dsn(
        'influxdb://user:pw@host:port/database'
    )
    print('Opened database successfully')

    fake_points = generate_random_points()
     
    test_client.write_points(fake_points) 
    test_client.write_points(fake_points, protocol=u'line')


if __name__ == '__main__':
    main()
“Most people find the concept of programming obvious, but the doing impossible.” — Alan J. Perlis
yokay
User
Beiträge: 26
Registriert: Mittwoch 15. August 2018, 13:50

danke __blackjack__ für deine Zeit und die ausführliche Antwort!! (sorry für den unübersichtlichen quelltext, daran muss ich echt noch arbeiten)

"`numeric_precision`, `field_columns`, und `tag_columns`" das stand in der methode drin, die Parameter.

Ich wollte damit erreichen, dass ich möglichst schnell viele verschiedene Daten in InfluxDB schreibe.

Ich probiere mal dein Beispiel anzuwenden! herzlichen Dank!

Lg.
Benutzeravatar
__blackjack__
User
Beiträge: 13004
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@yokay: In welcher Methode stand das? Jedenfalls nicht in InfluxDBClient.write_points().

Was sollte denn die Bedeutung von dem 'test' im Aufruf sein?
“Most people find the concept of programming obvious, but the doing impossible.” — Alan J. Perlis
yokay
User
Beiträge: 26
Registriert: Mittwoch 15. August 2018, 13:50

puhh wo genau ich aufgeschnappt habe weiß ich leider nicht mehr.

Was sollte denn die Bedeutung von dem 'test' im Aufruf sein? ------- Das sollte zum Aufruf der Datenbank auf Influx dienen, die 'test' hieß.

danke __blackjack__

Lg.
Benutzeravatar
__blackjack__
User
Beiträge: 13004
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@yokay: Und wie kommst Du darauf das der Name der Datenbank das zweite Argument ist? Es gibt eine Dokumentation, da steht genau was welche Methode an Argumenten erwartet, wie die heissen, was ihre Default-Werte sind, und was sie bedeuten. Wenn ein Aufruf nicht funktioniert, dann schaut man genau dort nach, und nicht irgendwo im Netz.
“Most people find the concept of programming obvious, but the doing impossible.” — Alan J. Perlis
yokay
User
Beiträge: 26
Registriert: Mittwoch 15. August 2018, 13:50

Hab vieles ausprobiert und aufgeschnappt deswegen wahrscheinlich.

Danke dir, für die Zukunft weiß ich bescheid :)

lg.
Antworten