Anfänger: Hilfe mit python bzw. psycopg2

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
truehumandesign
User
Beiträge: 20
Registriert: Sonntag 4. Dezember 2011, 19:20

Hi.. ihr habt recht das hätte ich vielleicht dazu schreiben sollen.

Die SQL Query sieht folgendermaßen aus:

Code: Alles auswählen

UPDATE tmp_foo SET "AMNR" = '12345678/'||("LFDNR")
die LFDNR ist ein Feld mit 8 Zahlen in der Datenbank
Davor soll eine Nummer mit einem Slash kommen
"123456/12345678"
Jedoch will ich über das python script, dass die Zahl vor dem Slash als Eingabefeld möglich ist, da sich diese Nummer ändern kann.

Vielleicht wird es jetzt etwas deutlicher.

Vielen Dank und Gruß!
frabron
User
Beiträge: 306
Registriert: Dienstag 31. März 2009, 14:36

Ich würde AMNR und LFDNR nicht in einem Feld gemeinsam speichern, sondern getrennt lassen. Das macht nur unnötige Arbeit beim Konsistent halten der DB, wenn du in einem Feld nicht normalisierte Daten vorhälst (siehe Normalisierung). Gerade weil du auch schreibst:
Jedoch will ich über das python script, dass die Zahl vor dem Slash als Eingabefeld möglich ist, da sich diese Nummer ändern kann
Das Zusammensetzen würde ich dann im Client (Python-Skript) oder im Select machen ...

Code: Alles auswählen

select AMNR||'\\'||LFDNR AS bar from foo
Benutzeravatar
/me
User
Beiträge: 3555
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

truehumandesign hat geschrieben:

Code: Alles auswählen

UPDATE tmp_foo SET "AMNR" = '12345678/'||("LFDNR")
die LFDNR ist ein Feld mit 8 Zahlen in der Datenbank
OK. jetzt sollten wir erst einmal das Statement aufräumen. Du hast da meiner Meinung nach mehrere unnötige Anführungszeichen und Klammern verteilt.

Code: Alles auswählen

UPDATE tmp_foo SET AMNR = '12345678/' || LFDNR
Als flexiblen Teil benötigst du also das '12345678/'. Das wird also im Python-Code der Teil, der den Platzhalter bekommt.

Code: Alles auswählen

UPDATE tmp_foo SET AMNR = %s || LFDNR
Der Wert, der an %s übergeben wird besteht aus einem eingegebenen Wert und einem folgenden Slash.

Code: Alles auswählen

value= '{0}/'.format(eingabewert)
Jetzt muss man nur noch das Statement ausführen. Wichtig ist, dass die zu ersetzenden Werte in einem Statement nicht als einzelne Parameter, sondern in einer Liste oder einem Tupel angegeben werden.

Code: Alles auswählen

cur.excute('UPDATE tmp_foo SET AMNR = %s || LFDNR', (value, ))
So weit zum technischen. Logisch habe ich allerdings ein Problem mit dem Konstrukt. Du baust dir da eine nicht erforderliche Redundanz ein. Oder soll die LFDNR als Teil des Felds AMNR nur ein Default-Wert sein der später überschrieben werden kann?
truehumandesign
User
Beiträge: 20
Registriert: Sonntag 4. Dezember 2011, 19:20

Die zusammengeführte Nummer (AMNR) wird auf einer Druckmaschine angedruckt die den Wert aus der SQL Datenbank ausliest
d.h. es gibt für mich keine Möglichkeit die zwei nummern getrennt zu lassen.
OK. jetzt sollten wir erst einmal das Statement aufräumen. Du hast da meiner Meinung nach mehrere unnötige Anführungszeichen und Klammern verteilt.

Code: Alles auswählen

UPDATE tmp_foo SET AMNR = '12345678/' || LFDNR
Das kann ich nicht, weil Postgre sonst amnr statts AMNR verwendet (Der Feldname ist in Großbuchstaben)

Edit:

@/me
Hat super funktioniert!!
im Programm steht nun

Code: Alles auswählen

amnr = '{0}/'.format(raw_input('AMNR Eingeben:'))
cur.execute('UPDATE tmp_foo SET "AMNR" = %s ||("LFDNR")', (amnr, ))
Jedoch versteh ich nicht warum ich dieses hier nicht verwenden soll.

Code: Alles auswählen

"""UPDATE tmp_foo SET "AMNR" = %s||("LFDNR");""", ('{0}/'.format(raw_input('AMNR Eingeben:')), ))
Das Ergebniss ist ja das gleiche
frabron
User
Beiträge: 306
Registriert: Dienstag 31. März 2009, 14:36

Die Druckmaschine führt SQL auf euer DB aus? Ansonsten hab ich dir doch gezeigt, wie man das auch im Statement zusammenführen kann bei der Abfrage ...
frabron
User
Beiträge: 306
Registriert: Dienstag 31. März 2009, 14:36

Jedoch versteh ich nicht warum ich dieses hier nicht verwenden soll.

Code: Alles auswählen

"""UPDATE tmp_foo SET "AMNR" = %s||("LFDNR");""", ('{0}/'.format(raw_input('AMNR Eingeben:')), ))
Das Ergebniss ist ja das gleiche
Was passiert, wenn .format sich mit einer Exception beendet, was passiert, wenn falsche/korrupte Daten über raw_input eingegeben werden? All das kannst du nicht abfangen, wenn du alles in einen Rutsch zusammenkleisterst. Mal abgesehen davon, dass das komplett unleserlich ist, vor allem, wenn du nach einem Jahr mal wieder drüberschauen musst (siehe auch PEP8 dazu, besonders die Zeilenlänge). Wieso willst du das eigenlich genau so schreiben? Variablenphobie? :)
truehumandesign
User
Beiträge: 20
Registriert: Sonntag 4. Dezember 2011, 19:20

frabron hat geschrieben:
Jedoch versteh ich nicht warum ich dieses hier nicht verwenden soll.

Code: Alles auswählen

"""UPDATE tmp_foo SET "AMNR" = %s||("LFDNR");""", ('{0}/'.format(raw_input('AMNR Eingeben:')), ))
Das Ergebniss ist ja das gleiche
Was passiert, wenn .format sich mit einer Exception beendet, was passiert, wenn falsche/korrupte Daten über raw_input eingegeben werden? All das kannst du nicht abfangen, wenn du alles in einen Rutsch zusammenkleisterst. Mal abgesehen davon, dass das komplett unleserlich ist, vor allem, wenn du nach einem Jahr mal wieder drüberschauen musst (siehe auch PEP8 dazu, besonders die Zeilenlänge). Wieso willst du das eigenlich genau so schreiben? Variablenphobie? :)
Mit der Übersicht hast du recht.
Ich lasse mich gerne eines besseren belehren :lol:

Vielen Dank!!!!
Antworten