MySQL - Prüfung ob Eintrag vorhanden

Installation und Anwendung von Datenbankschnittstellen wie SQLite, PostgreSQL, MariaDB/MySQL, der DB-API 2.0 und sonstigen Datenbanksystemen.
Antworten
magkro
User
Beiträge: 2
Registriert: Dienstag 1. November 2016, 15:01

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
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.
Benutzeravatar
/me
User
Beiträge: 3555
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

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.
magkro
User
Beiträge: 2
Registriert: Dienstag 1. November 2016, 15:01

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ß
Sirius3
User
Beiträge: 17749
Registriert: Sonntag 21. Oktober 2012, 17:20

@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.
Benutzeravatar
noisefloor
User
Beiträge: 3856
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: WW
Kontaktdaten:

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
Benutzeravatar
Judge
User
Beiträge: 129
Registriert: Mittwoch 13. Juni 2012, 22:27
Wohnort: Ratingen
Kontaktdaten:

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.
Benutzeravatar
Judge
User
Beiträge: 129
Registriert: Mittwoch 13. Juni 2012, 22:27
Wohnort: Ratingen
Kontaktdaten:

/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?
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.
Antworten