Ändern von Bezeichnungen in einer Liste

Code-Stücke können hier veröffentlicht werden.
Benutzeravatar
snafu
User
Beiträge: 6731
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Normalerweise ja, aber wir sehen das hier nicht ganz so eng. Solange das hier kein Sammelthread für deine Fragen der nächsten 12 Monate wird, denke ich, dass es in Ordnung geht, wenn du die Frage hier im Thread stellst.
andyritter
User
Beiträge: 29
Registriert: Montag 7. März 2016, 16:27

@snafu: ok, dann frage ich mal nach ;-)

Hier der Teil für den Insert erweitert um die Eingrenzung

Code: Alles auswählen

for item in t['tenants']:
    osp_tenants_tenant_id = item['id']
    osp_tenants_name = item['name']
    osp_tenants_description = item['description']
    print(osp_tenants_tenant_id)
    print(osp_tenants_name)
    print(osp_tenants_description)
    cur.execute("""INSERT INTO osp_tenants (name, tenant_id, description) VALUES (%s, %s, %s)""",(osp_tenants_name, osp_tenants_tenant_id, osp_tenants_description)\
"""(if not exists (select tenant_id from osp_tenants where tenant_id = %s)""",(osp_tenants_tenant_id))
    conn.commit()
erhalte ich immer Invalid Syntax und die Markierung steht auf dem letzten " vor
,(osp_tenants_tenant_id))
conn.commit()

Mein Ziel ist es, die Werte die in der Datenbank sind nicht nochmal einzufügen

ich hab schon so viel verschiedenes in Internet gelesen, aber einen besseren Ansatz habe ich noch nicht gefunden :cry:
Zuletzt geändert von Anonymous am Montag 21. März 2016, 17:32, insgesamt 1-mal geändert.
Grund: Quelltext in Code-Tags gesetzt.
BlackJack

@andyritter: Das ist halt kein gültiges Python. Und AFAIK wird das auch in SQL so nicht möglich sein mit einem bedingten Einfügen.

Entweder fragt man vorher die ID ab, oder man deklariert die als UNIQUE (falls das nicht sowieso schon der Primärschlüssel ist) und behandelt die auftretende Ausnahme entsprechend.
Benutzeravatar
miracle173
User
Beiträge: 127
Registriert: Samstag 6. Februar 2016, 00:28

@snafu: Wenn normalerweise ja, warum jetzt nicht? Es ist eigentlich nicht sinnvoll, eine andere Frage hier zu posten. Es passt nicht zum Thread-Titel, ist als Frage nicht zu finden und wenn jemand nocht etwas zur ursprünglichen Frage posten will, ergibt das dann ein völliges Durcheinander von Antworten. Einen Vorteil kann ich eigentlich keinen erkennen.
Benutzeravatar
snafu
User
Beiträge: 6731
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

@miracle173
Prinzipiell hast du Recht. Ich stimme deiner Begründung völlig zu.

Es ist aber jetzt auch kein Beinbruch für mich. Und ich weiß, dass auch in anderen Threads schon Folgefragen gestellt wurden, die zwar auf dem ursprünglichen Thema aufgebaut haben, aber streng genommen hätte man sie isoliert in einem eigenen Thread stellen müssen.

Wenn es dir ein wichtiges Anliegen ist, die beiden Themen zu trennen, dann wende dich am besten direkt an die Moderatoren (z.B an BlackJack), damit der Thread nachträglich gesplittet wird.

Wie gesagt: Mir ist es ehrlich gesagt egal, wenn man ausnahmsweise den selben Thread für eine Folgefrage nutzt. Es sollte nur nicht zur Regelmäßigkeit werden.
andyritter
User
Beiträge: 29
Registriert: Montag 7. März 2016, 16:27

@BlackJack: Ich habe die Spalte als UNIQUE deklariert. Danke für den Hinweis.


Ich habe den Insert wie folgt gelöst:

Code: Alles auswählen

# Einfügen der Werte aus der Tenant Abfrage
for item in t['tenants']:
    osp_tenants_tenant_id = item['id']
    osp_tenants_name = item['name']
    osp_tenants_description = item['description']
    #print(osp_tenants_tenant_id ,osp_tenants_name, osp_tenants_description)
    try:
        cur.execute("""INSERT INTO osp_tenants (name, tenant_id, description) VALUES (%s, %s, %s)""", (osp_tenants_name, osp_tenants_tenant_id, osp_tenants_description))
        print("Neuer Eintrag:", osp_tenants_name, osp_tenants_tenant_id, osp_tenants_description)
    except:
        print(osp_tenants_tenant_id,"schon vorhanden")
        print("-------------------------------------------------------")
Weitere Fragen werde ich in einem Neuen Thread stellen ;-)
Danke an alle für Eure Unterstützung. :D
Zuletzt geändert von Anonymous am Dienstag 22. März 2016, 11:55, insgesamt 1-mal geändert.
Grund: Quelltext in Code-Tags gesetzt.
BlackJack

@andyritter: Nackte ``except:``\s sind keine gute Idee. Du behandelst hier *jede* Ausnahme so als wäre die ID schon vorhanden, auch wenn die Ausnahme einen ganz anderen Grund hat. Zum Beispiel ein Programmierfehler, oder ein Netzwerkproblem, oder das die Datenbank nicht (mehr) erreichbar ist, oder…
andyritter
User
Beiträge: 29
Registriert: Montag 7. März 2016, 16:27

BlackJack hat geschrieben:@andyritter: Nackte ``except:``\s sind keine gute Idee. Du behandelst hier *jede* Ausnahme so als wäre die ID schon vorhanden, auch wenn die Ausnahme einen ganz anderen Grund hat. Zum Beispiel ein Programmierfehler, oder ein Netzwerkproblem, oder das die Datenbank nicht (mehr) erreichbar ist, oder…
@BlackJack: Wie kann ich denn einen IOError ausklammern, dass das Script weiter ausgeführt wird? Wenn ich den IOError mit aufführe,

Code: Alles auswählen

for item in t['tenants']:
    osp_tenants_tenant_id = item['id']
    osp_tenants_name = item['name']
    osp_tenants_description = item['description']
    #print(osp_tenants_tenant_id ,osp_tenants_name, osp_tenants_description)
    try:
        cur.execute("""INSERT INTO osp_tenants (name, tenant_id, description) VALUES (%s, %s, %s)""", (osp_tenants_name, osp_tenants_tenant_id, osp_tenants_description))
        print("Neuer Eintrag:", osp_tenants_name, osp_tenants_tenant_id, osp_tenants_description)
    except IOError as e:
        print(osp_tenants_tenant_id,"schon vorhanden")
        print("-------------------------------------------------------")
    else:
        print("alles ok")

erscheint diese Fehlermeldung:

Traceback (most recent call last):
File "/home/akquinet/Dokumente/Database_insert_tenants.py", line 76, in <module>
cur.execute("""INSERT INTO osp_tenants (name, tenant_id, description) VALUES (%s, %s, %s)""", (osp_tenants_name, osp_tenants_tenant_id, osp_tenants_description))
IntegrityError: duplicate key value violates unique constraint "osp_tenants_tenant_id_key"
DETAIL: Key (tenant_id)=(abcd) already exists.

Bei allen Möglichkeiten,die ich bei Google gefunden habe wird diese Fehlerbehandlung nicht dargestellt oder ich verstehe es nicht.
Zuletzt geändert von Anonymous am Donnerstag 24. März 2016, 09:59, insgesamt 1-mal geändert.
Grund: Quelltext in Code-Tags gesetzt.
BlackJack

@andyritter: Du behandelst einen `IOError` (warum?), und bekommst bei einer bereits vorhandenen `tenant_id` einen `IntegrityError`. Finde den Fehler. ;-)
andyritter
User
Beiträge: 29
Registriert: Montag 7. März 2016, 16:27

@BlackJAck: Wenn ich den IntegrityError abfangen will mit:

Code: Alles auswählen

for item in t['tenants']:
    osp_tenants_tenant_id = item['id']
    osp_tenants_name = item['name']
    osp_tenants_description = item['description']
    #print(osp_tenants_tenant_id ,osp_tenants_name, osp_tenants_description)
    try:
        cur.execute("""INSERT INTO osp_tenants (name, tenant_id, description) VALUES (%s, %s, %s)""", (osp_tenants_name, osp_tenants_tenant_id, osp_tenants_description))
        print("Neuer Eintrag:", osp_tenants_name, osp_tenants_tenant_id, osp_tenants_description)
    except IntegrityError as e:
        print(osp_tenants_tenant_id,"schon vorhanden")
        print("-------------------------------------------------------")
    else:
        print("alles ok")
Erhalte ich diese Fehlermeldung:

Traceback (most recent call last):
File "/home/akquinet/Dokumente/Database_insert_tenants.py", line 78, in <module>
except IntegrityError as e:
NameError: name 'IntegrityError' is not defined

Wobei mich dann wiederum stutzig macht, dass die Fehlerbezeichnung nicht definiert sein soll.
Zuletzt geändert von Anonymous am Donnerstag 24. März 2016, 10:23, insgesamt 1-mal geändert.
Grund: Quelltext in Code-Tags gesetzt.
Benutzeravatar
miracle173
User
Beiträge: 127
Registriert: Samstag 6. Februar 2016, 00:28

Code: Alles auswählen

Traceback (most recent call last):
File "/home/akquinet/Dokumente/Database_insert_tenants.py", line 76, in <module>
cur.execute("""INSERT INTO osp_tenants (name, tenant_id, description) VALUES (%s, %s, %s)""", (osp_tenants_name, osp_tenants_tenant_id, osp_tenants_description))
IntegrityError: duplicate key value violates unique constraint "osp_tenants_tenant_id_key"
DETAIL: Key (tenant_id)=(abcd) already exists.
Da braucht man nicht googeln, da braucht man schlimmstenfalls ein Lexikon, um sich das ganze ins Deutsche zu übersetzten, wenn man es so nicht versteht. Da steht doch alles drin, was passiert ist.

in etwa

Beim Ausführen von
cur.execute("""INSERT INTO osp_tenants (name, tenant_id, description) VALUES (%s, %s, %s)""", (osp_tenants_name, osp_tenants_tenant_id, osp_tenants_description))

Anmerkung von mir: das ist das Einfügen eines Datensatzes in die Datenbank

in der Zeile 76 der Datei "Database_insert_tenants.py" gabs den
Integritäts-Fehler: doppelter Schlüsselwert verletzt die Eindeutigkeitsbeschränkung "osp_tenants_tenant_id_key"
Detail: Den Schlüssel (tenant_id)=(abcd) gibt es schon.

Was ist dir daran nicht klar?
BlackJack

@andyritter: Das ist eine Ausnahme die spezifisch für Datenbanken ist, natürlich fällt das nicht einfach so vom Himmel und ist auf magische Weise verfügbar. Du musst die Ausnahme schon aus dem Modul importieren in dem sie definiert wurde, wie alle anderen Datentypen ausser den eingebauten halt auch.
andyritter
User
Beiträge: 29
Registriert: Montag 7. März 2016, 16:27

@miracle: Mir ist nicht klar, wie ich es fertig bringe, dass das Script weiterläuft, auch wenn für einen Datensatz ein "IntegrityError: duplicate key value violates unique constraint" geworfen wird.

@BlackJack: Leider habe ich keine Ahnung, in welchem Modul dieser Fehler definiert sein soll. Kannst Du mir da einen Tipp geben?
Danke schön
BlackJack

@andyritter: Nee, kann ich nicht. Ich bin gerade zu sehr mit kopfschütteln beschäftigt. In welchem Modul mag wohl der Ausnahmetyp für Datenbankfehler definiert sein… Wie soll man da bloss drauf kommen… :roll:
andyritter
User
Beiträge: 29
Registriert: Montag 7. März 2016, 16:27

except psycopg2.IntegrityError:
Antworten