Seite 1 von 1

MySQL - Prüfung ob Eintrag vorhanden

Verfasst: Dienstag 1. November 2016, 15:13
von magkro
Hallo,
ich möchte gerne eine Datenbank mittels Python 2.7 überprüfen ob ein Eintrag mit einer spezifischen ID schon existiert.
Der MySQL Query sollte ja lauten:
SELECT * FROM testdb WHERE ID = 0815

cursor = connection.cursor()
cursor.execute("SELECT * FROM testdb WHERE ID = 0815")

Wenn dieser Query keine Ergebnisse zurück liefert, existiert kein Eintrag mit der ID = 0815 in der Datenbank.
Wie setze ich das in Python um?
Kann mir jemand eine Tipp geben?

MFG

Re: MySQL - Prüfung ob Eintrag vorhanden

Verfasst: Dienstag 1. November 2016, 15:45
von BlackJack
@magkro: Na im Grunde hast Du es doch schon fast. Du musst jetzt nur noch mindestens einen Datensatz vom `cursor` abfragen und Dir das Ergebnis davon anschauen.

Als Abfrage würde ich übrigens nicht ``SELECT * FROM …`` verwenden sondern ``SELECT 1 FROM …`` oder irgend einen anderen Wert. Zumindest wenn Du gar nicht an dem Datensatz interessiert bist, sondern nur wissen willst ob er existiert oder nicht.

Selbst wenn man am Datensatz interessiert ist würde man eher die Spaltennamen explizit aufführen statt dem * denn dann ist der Code robust gegen neu hinzugefügte Spalten oder die Änderung der Spaltenreihenfolge.

Re: MySQL - Prüfung ob Eintrag vorhanden

Verfasst: Dienstag 1. November 2016, 18:02
von /me
BlackJack hat geschrieben:Als Abfrage würde ich übrigens nicht ``SELECT * FROM …`` verwenden sondern ``SELECT 1 FROM …`` oder irgend einen anderen Wert.
Wenn es schon ums Zählen geht würde ich auch explizit SELECT COUNT(*) FROM ... verwenden.

Re: MySQL - Prüfung ob Eintrag vorhanden

Verfasst: Mittwoch 2. November 2016, 15:06
von magkro
Hallo,
Danke für die Antworten und Tipps.

Doch leider hab ich keine Ahnung wie ich den Tipp umsetzen soll.
Du musst jetzt nur noch mindestens einen Datensatz vom `cursor` abfragen und Dir das Ergebnis davon anschauen.

Muss ich zur Umsetzung cursor.fetchall() verwenden oder gibt es einen einfacheren Weg?


Gruß

Re: MySQL - Prüfung ob Eintrag vorhanden

Verfasst: Mittwoch 2. November 2016, 15:20
von Sirius3
@magkro: was ist an einem fetchall so kompliziert? Es gibt auch noch fetchone, fetchmany oder next(cursor), je nachdem was Du mit dem Ergebnis machen willst.

Re: MySQL - Prüfung ob Eintrag vorhanden

Verfasst: Mittwoch 2. November 2016, 16:23
von noisefloor
Hallo,
Du musst jetzt nur noch mindestens einen Datensatz vom `cursor` abfragen und Dir das Ergebnis davon anschauen.
Heißt konkret: du musst schon _ob_ es ein konkretes Ergebnis gibt oder ob die Abfrage `None` zurück liefert. Bei letzterem existiert der Datensatz nicht.

Von daher ist es auch egal, ob du `fetchall()`oder `fetchone()` nutzt. Der "Aufwand" und das Vorgehen ist identisch.

Gruß, noisefloor

Re: MySQL - Prüfung ob Eintrag vorhanden

Verfasst: Donnerstag 3. November 2016, 12:21
von Judge
Ich glaube genau das war die Frage - ob '.fetch*()' da die korrekte Funktion für ist.
Ich, selbst Python und DB-N00b, hab mich das auch schon zur Python DB API gefragt. Gerade diese 'gab es ein Ergebnis?' Nummer ; kann ja genauso gut sein, das da ein bool oder so irgendwo auf false gesetzt wird, so das man sich das konkrete Ergebnis nicht mehr anschauen muss.

Re: MySQL - Prüfung ob Eintrag vorhanden

Verfasst: Donnerstag 3. November 2016, 12:25
von Judge
/me hat geschrieben:
BlackJack hat geschrieben:Als Abfrage würde ich übrigens nicht ``SELECT * FROM …`` verwenden sondern ``SELECT 1 FROM …`` oder irgend einen anderen Wert.
Wenn es schon ums Zählen geht würde ich auch explizit SELECT COUNT(*) FROM ... verwenden.
Aber bei nur "existiert - ja/nein?" ist 1 doch aus Sicht der Last auf der DB besser, da die RDMS die ich kenne bei '1' alle nach dem ersten Fund aufhören zu suchen und keine weitere Last erzeugen, oder irre ich mich?

Re: MySQL - Prüfung ob Eintrag vorhanden

Verfasst: Donnerstag 3. November 2016, 12:55
von BlackJack
@Judge: In diesem Fall kann es nur 1 oder 0 sein, denn pro RFID wird da ja wohl nur ein Datensatz existieren und damit auch ein UNIQUE-Constraint auf der Spalte liegen, was in der Regel einen Index impliziert in dem schnell nachgeschaut werden kann ob es denn nun 1 oder 0 ist. Ich denke nicht, dass es dort wirklich grosse Laufzeitunterschiede gibt.