1. Willkommen im Forum für alle Datenbanken! Registriere Dich kostenlos und diskutiere über DBs wie Mysql, MariaDB, Oracle, Sql-Server, Postgres, Access uvm
    Information ausblenden

Fehlermeldung bei INSERT INTO...

Dieses Thema im Forum "PostgreSQL" wurde erstellt von christofj, 11 Oktober 2018.

  1. christofj

    christofj Aktiver Benutzer

    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?
     
  2. akretschmer

    akretschmer Datenbank-Guru

    zeig mal das komplette INSERT
     
  3. akretschmer

    akretschmer Datenbank-Guru

    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 ...
     
  4. christofj

    christofj Aktiver Benutzer

    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)
    
     
  5. akretschmer

    akretschmer Datenbank-Guru

    ja, du mußt halt da die Variablen einsetzen, so wird es nix ...
     
  6. akretschmer

    akretschmer Datenbank-Guru

  7. christofj

    christofj Aktiver Benutzer

    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?
     
  8. akretschmer

    akretschmer Datenbank-Guru

    ja.

    Vermutlich gehört die Tabelle postgres, als solcher dann:

    Code:
    grant insert, update on sensordatentab_x_werte to sensorinput;
    
     
  9. christofj

    christofj Aktiver Benutzer

    Danke, jetzt läuft's.
    :cool:
     
    akretschmer gefällt das.
  10. christofj

    christofj Aktiver Benutzer

    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.
     
  11. akretschmer

    akretschmer Datenbank-Guru

    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=*#
    
     
Die Seite wird geladen...

Diese Seite empfehlen

  1. Diese Seite verwendet Cookies. Wenn du dich weiterhin auf dieser Seite aufhältst, akzeptierst du unseren Einsatz von Cookies.
    Information ausblenden