Seite 2 von 2
Re: Ändern von Bezeichnungen in einer Liste
Verfasst: Montag 21. März 2016, 14:13
von snafu
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.
Re: Ändern von Bezeichnungen in einer Liste
Verfasst: Montag 21. März 2016, 17:30
von andyritter
@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

Re: Ändern von Bezeichnungen in einer Liste
Verfasst: Montag 21. März 2016, 17:35
von 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.
Re: Ändern von Bezeichnungen in einer Liste
Verfasst: Montag 21. März 2016, 17:42
von miracle173
@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.
Re: Ändern von Bezeichnungen in einer Liste
Verfasst: Montag 21. März 2016, 23:24
von snafu
@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.
Re: Ändern von Bezeichnungen in einer Liste
Verfasst: Dienstag 22. März 2016, 11:52
von andyritter
@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.

Re: Ändern von Bezeichnungen in einer Liste
Verfasst: Dienstag 22. März 2016, 11:58
von 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…
Re: Ändern von Bezeichnungen in einer Liste
Verfasst: Donnerstag 24. März 2016, 09:49
von andyritter
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.
Re: Ändern von Bezeichnungen in einer Liste
Verfasst: Donnerstag 24. März 2016, 10:02
von BlackJack
@andyritter: Du behandelst einen `IOError` (warum?), und bekommst bei einer bereits vorhandenen `tenant_id` einen `IntegrityError`. Finde den Fehler.

Re: Ändern von Bezeichnungen in einer Liste
Verfasst: Donnerstag 24. März 2016, 10:12
von andyritter
@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.
Re: Ändern von Bezeichnungen in einer Liste
Verfasst: Donnerstag 24. März 2016, 10:21
von miracle173
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?
Re: Ändern von Bezeichnungen in einer Liste
Verfasst: Donnerstag 24. März 2016, 10:25
von 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.
Re: Ändern von Bezeichnungen in einer Liste
Verfasst: Donnerstag 24. März 2016, 10:47
von andyritter
@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
Re: Ändern von Bezeichnungen in einer Liste
Verfasst: Donnerstag 24. März 2016, 10:56
von 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…

Re: Ändern von Bezeichnungen in einer Liste
Verfasst: Donnerstag 24. März 2016, 11:20
von andyritter
except psycopg2.IntegrityError: