Update Postgresql

Installation und Anwendung von Datenbankschnittstellen wie SQLite, PostgreSQL, MariaDB/MySQL, der DB-API 2.0 und sonstigen Datenbanksystemen.
Antworten
köttbullar
User
Beiträge: 34
Registriert: Donnerstag 6. August 2015, 19:23

Hallo Forum,

ich habe eine ganz blöde frage ;-)
und zwar wollte ich werte in eine Datenbank schreiben. (siehe erster Programmteil)
dies funktioniert sehr gut, da ich absoluter Python Neuling bin, hätte ich gedacht, dass das update so ähnlich funktioniert. (siehe zweiter Programmteil)
Leider funktioniert dies so nicht, es kommt folgende Fehlermeldung:
Traceback (most recent call last):
File "mc.py", line 116, in <module>
adcs(netio)
File "mc.py", line 97, in adcs
cur.execute('UPDATE PollinAVR SET (ID, State, time) values(%s, %s, %s)', ("ADC1", ADC1, CURRENT_TIMESTAMP))
psycopg2.ProgrammingError: syntax error at or near "values"
LINE 1: UPDATE PollinAVR SET (ID, State, time) values('ADC1', '424',...
^

Außerdem bin ich mir sicher dass man sowas noch schöner machen kann.
wie date ich eine Leere Tabelle ab? müssen da Werte drin stehen oder geht das auch mit leeren?

vielen Dank

Code: Alles auswählen

       CURRENT_TIMESTAMP = datetime.now()
        print CURRENT_TIMESTAMP
        cur.execute('insert into PollinAVR (ID, State,time) values(%s, %s, %s)', ("ADC1", ADC1, CURRENT_TIMESTAMP))
        conn.commit()
        CURRENT_TIMESTAMP = datetime.now()
        print CURRENT_TIMESTAMP
        cur.execute('insert into PollinAVR (ID, State,time) values(%s, %s, %s)', ("ADC2", ADC2, CURRENT_TIMESTAMP))
        conn.commit()
        CURRENT_TIMESTAMP = datetime.now()
        print CURRENT_TIMESTAMP
        cur.execute('insert into PollinAVR (ID, State,time) values(%s, %s, %s)', ("ADC3", ADC3, CURRENT_TIMESTAMP))
        conn.commit()
        CURRENT_TIMESTAMP = datetime.now()
        print CURRENT_TIMESTAMP
        cur.execute('insert into PollinAVR (ID, State,time) values(%s, %s, %s)', ("ADC4", ADC4, CURRENT_TIMESTAMP))
        conn.commit()

        CURRENT_TIMESTAMP = datetime.now()
        print CURRENT_TIMESTAMP
        cur.execute('UPDATE PollinAVR SET (ID, State, time) values(%s, %s, %s)', ("ADC1", ADC1, CURRENT_TIMESTAMP))
        conn.commit()
        CURRENT_TIMESTAMP = datetime.now()
        print CURRENT_TIMESTAMP
        cur.execute('UPDATE PollinAVR SET (ID, State, time) values(%s, %s, %s)', ("ADC2", ADC2, CURRENT_TIMESTAMP))
        conn.commit()
        CURRENT_TIMESTAMP = datetime.now()
        print CURRENT_TIMESTAMP
        cur.execute('UPDATE PollinAVR SET (ID, State, time) values(%s, %s, %s)', ("ADC3", ADC3, CURRENT_TIMESTAMP))
        conn.commit()
        CURRENT_TIMESTAMP = datetime.now()
        print CURRENT_TIMESTAMP
        cur.execute('UPDATE PollinAVR SET (ID, State, time) values(%s, %s, %s)', ("ADC4", ADC4, CURRENT_TIMESTAMP))
        conn.commit()
Sirius3
User
Beiträge: 17749
Registriert: Sonntag 21. Oktober 2012, 17:20

@köttbullar: statt Variablen durchzunummerieren würde man Listen nehmen und statt Zeilen zu kopieren würde man Schleifen nehmen. Die Syntax von Update ist "UPDATE table SET field = value WHERE condition". Woher soll die Datenbank sonst wissen, welche Zeilen geupdated werden sollen?
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

köttbullar hat geschrieben:... da ich absoluter Python Neuling bin, hätte ich gedacht, dass das update so ähnlich funktioniert.
Die Kausalkette ist falsch: Das hat nichts mit Python zu tun, sondern mit SQL!
Es muss also lauten "Da ich absoluter SQL-Neuling bin, ..." ;-)

Besser könnte man es machen, indem man den Code weniger redundant gestaltet. Dazu könnte man die Daten in einer passenden Struktur vorhalten (z.B. einer Liste von Tupeln) und das dann in einer Schleife per ``INSERT``-Kommando absetzen, oder die Möglichkeiten von ``INSERT`` ausnutzen und direkt *alle* Tupel in einem Rutsch absetzen.

Bei fixen Daten würde ich das auch außerhalb von Python lösen und die Statements einfach in ein SQL-Script schreiben.

Den Timestamp kann man auch durch die DB setzen lassen - es sei denn, man will unbedingt einen lokalen haben.

Die letzte Frage bezüglich der "leeren" oder "vollen" Daten habe ich nicht verstanden!
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
köttbullar
User
Beiträge: 34
Registriert: Donnerstag 6. August 2015, 19:23

das Problem ist eher die Kombination zwischen Python und Postgresql
wie muss es denn richtig heißen?
BlackJack

@köttbullar: Das Problem ist beim gezeigten Beitrag eindeutig das SQL was nicht passend und syntaktisch falsch war. Willst Du vorhandene Werte aktualisieren? Dann brauchst Du UPDATE mit einer WHERE-Klausel die sagt *welche* Werte aktualisiert werden sollen. Oder willst Du neue Werte einfügen? Dann brauchst Du INSERT. Vielleicht interessiert Dich ja Learn SQL The Hard Way.
köttbullar
User
Beiträge: 34
Registriert: Donnerstag 6. August 2015, 19:23

mit where funktioniert es ja auch nicht!

Code: Alles auswählen

CURRENT_TIMESTAMP = datetime.now()
print CURRENT_TIMESTAMP
cur.execute('UPDATE PollinAVR SET (ID, State, time) WHERE ID = "ADC1" values(%s, %s, %s)', ("ADC1", ADC1, CURRENT_TIMESTAMP))
conn.commit()
BlackJack

@köttbullar: Raten von Syntax funktioniert nicht. Nach welcher Dokumentation bist Du auf die Idee gekommen diesen SQL-Ausdruck zu schreiben?
köttbullar
User
Beiträge: 34
Registriert: Donnerstag 6. August 2015, 19:23

Ich habe viel gegoogelt und bin wie du sehen kannst zu keinem Ergebnis gekommen.
ich frag nur wenn ich nicht weiter komm ;-)
Benutzeravatar
pillmuncher
User
Beiträge: 1484
Registriert: Samstag 21. März 2009, 22:59
Wohnort: Pfaffenwinkel

@köttbullar: Du musst an deinem Google Fu arbeiten.

=> nach "sql syntax update" googlen.
=> auf den ersten Link klicken.
=> das hier finden:

Code: Alles auswählen

UPDATE table_name
SET column1=value1,column2=value2,...
WHERE some_column=some_value;
In specifications, Murphy's Law supersedes Ohm's.
BlackJack

@köttbullar: Was heisst viel gegooglet? Wonach? Wenn ich "postgrestql update" als Suchbegriffe eingebe dann bekomme ich als erstes den Link zu UPDATE in der PostgreSQL-Dokumentation. Ansonsten schau Dich nach einer Quelle zum lernen von SQL und relationalen Datenbanken um. Einen Link dafür habe ich ja schon gepostet. SQL ist eine eigene Sprache und relationale Datenbanken ein nicht ganz triviales Thema. Das bekommt man nicht durch suchen nach Beispielquelltext in den Griff.
Benutzeravatar
noisefloor
User
Beiträge: 3856
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: WW
Kontaktdaten:

Hallo,
Ich habe viel gegoogelt und bin wie du sehen kannst zu keinem Ergebnis gekommen.
Hast du denn die Links hinter den Suchtreffern auch gelesen? Wohl eher nicht...

Dein Problem hat ja noch nicht mal was mit PostgreSQL zu tun, weil das Standard-SQL ist, was jede SQL-DB versteht.

Gruß, noisefloor
köttbullar
User
Beiträge: 34
Registriert: Donnerstag 6. August 2015, 19:23

und wie bekomme ich nun anstatt eines Integer Wertes bei state = 535 einen variable hinein?
das hat wohl nicht mehr was mit postgresql zu tun oder?

Code: Alles auswählen

cur.execute("UPDATE PollinAVR SET id='ADC1',state=535 WHERE id='ADC1'")
Benutzeravatar
noisefloor
User
Beiträge: 3856
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: WW
Kontaktdaten:

Hallo,
das hat wohl nicht mehr was mit postgresql zu tun oder?
Richtig, das hat was mit der Python DB-API 2.0 zu tun.

Beispiele & Doku findest du dazu bergeweise im Netz. Du könntest z.B. dir durchlesen, wie es in der Python Doku für SQLite beschrieben ist - das ist 1:1 auf PosgreSQL übertragbar.

Oder du nimmst direkt einen ORM wie SQLAlchemy - wie BlackJack an dieser Stelle immer zu sagen pflegt :-)

Gruß, noisefloor
Antworten