Fehlermeldung bei INSERT INTO...

christofj

Fleissiger Benutzer
Beiträge
55
Hallo zusammen,

mit einem Skript versuche ich Daten in die DB einzutragen. Dabei bekomme ich diese Fehlermeldung:

Code:
column "sensoridx" does not exist
LINE 1: ...idx, measurement_point, xdata, timestamp) values (sensoridx,...
                                                             ^
HINT:  There is a column named "sensoridx" in table "sensordatentab_x_werte", but it cannot be referenced from this part of the query.

Die Tabelle und die Spalte existieren, daher denke ich das ich den Benutzer noch Berechtigungen erteilen muss.
Den Benutzer habe ich so angelegt:

Code:
sudo -u postgres createuser -P sensorinput

Wenn ich mir die Benutzer anschaue finde ich dieses:

Code:
postgres-# \du
                                       Liste der Rollen
 Rollenname  |                            Attribute                            | Mitglied von
-------------+-----------------------------------------------------------------+--------------
 appuser_jlc |                                                                 | {}
 postgres    | Superuser, Rolle erzeugen, DB erzeugen, Replikation, Bypass RLS | {}
 sensorinput |                                                                 | {}
 u279845     |                                                                 | {}

Der Benutzer "sensorinput" soll nur Daten einfügen und updaten können.
Kann die Fehlermeldung damit im Zusammenhang stehen?
 
Werbung:
ich kann es nachvolliehen:

Code:
test=*# insert into foo (id, val, val2) values (id, val, val2);
ERROR:  column "id" does not exist
LINE 1: insert into foo (id, val, val2) values (id, val, val2);
                                                ^
HINT:  There is a column named "id" in table "foo", but it cannot be referenced from this part of the query.
test=*#

wie man sieht: das INSERT ist falsch ...
 
Code:
conn = psycopg2.connect(host="localhost",database="sensordatas", user="sensorinput", password="password")
        # create a new cursor
        cur = conn.cursor()
        # zeitstempel
        timestamp = str(datetime.datetime.now())
        sensoridx = sensorid
 sql = 'insert into sensordatentab_x_werte (sensoridx, measurement_point, xdata, timestamp) values (sensoridx, measurepoint, Data5, timestamp) on conflict (sensoridx, measurement_point) do update set xdata = excluded.xdata, timestamp = excluded.timstamp, update_measured_series = true;'

cur.execute(sql)
 
danke, habe jetzt erst mal die INSERT Anweisung verkürzt und Werte eingesetzt.
Code:
sql = 'insert into sensordatentab_x_werte (sensoridx, measurement_point, xdata) values (9999, 22222, 33333);'
Fehlermeldung:
Code:
permission denied for relation sensordatentab_x_werte
Ist es außerdem ein Berechtigungsproblem?
 
Ich habe jetzt das Skript auf INSERT ON CONFLICT erweitert,
dabei bekomme ich diese Fehlermeldung:
Code:
tuple index out of range
Hier die Anweisung:

Code:
sql = 'insert into sensordatentab_x_werte (sensoridx, measurement_point, xdata, timestamp) values (%s, %s, %s, %s) on conflict (sensoridx, measurement_point) do update set sensoridx = %s, measurement_point = %s  xdata = %s, timestamp = %s;'
datensatz = (sensorid, measurement_point, Data5, time)
cur.execute(sql, (datensatz))
conn.commit()
Ich habe es auch schon mit excluded. versucht. Ohne Erfolg.
sensoridx & measurement_point aus der -on conflict- habe ich bei der -do update set- eingefügt weil ich denke dass, das Problem beim datensatz liegt den ich dem cur.execute mit den vier Variablen mitgebe.

Kann jemand eine Lösung vorschlagen?
Es soll wenn der Sensor mit dem Messpunkt in der Tabelle vorhanden ist nur der Wert xdata und der Zeitstempel ersetzt werden.
 
Werbung:
Du darfst die Spalten, die den Konflikt auslösen, da nicht noch mal updaten.

Code:
test=*# create table foo(a int, b int, c int, d int, primary key(a,b));
CREATE TABLE
test=*# insert into foo (a,b,c,d) values (1,2,3,4) on conflict (a,b) do update set c=exclude.c, d=excluded.d;
FEHLER:  fehlender Eintrag in FROM-Klausel für Tabelle »exclude«
LINE 1: ...alues (1,2,3,4) on conflict (a,b) do update set c=exclude.c,...
                                                             ^
test=*# insert into foo (a,b,c,d) values (1,2,3,4) on conflict (a,b) do update set c=excluded.c, d=excluded.d;
INSERT 0 1
test=*#
test=*#
test=*# insert into foo (a,b,c,d) values (1,2,33,43) on conflict (a,b) do update set c=excluded.c, d=excluded.d;
INSERT 0 1
test=*# insert into foo (a,b,c,d) values (5,6,7,8) on conflict (a,b) do update set c=excluded.c, d=excluded.d;
INSERT 0 1
test=*# insert into foo (a,b,c,d) values (1,2,333,433) on conflict (a,b) do update set c=excluded.c, d=excluded.d;
INSERT 0 1
test=*# select * from foo;
 a | b |  c  |  d  
---+---+-----+-----
 5 | 6 |   7 |   8
 1 | 2 | 333 | 433
(2 rows)

test=*#
 
Zurück
Oben