Anzahl der Ergebnisse

Installation und Anwendung von Datenbankschnittstellen wie SQLite, PostgreSQL, MariaDB/MySQL, der DB-API 2.0 und sonstigen Datenbanksystemen.
Antworten
jovica.aleksic
User
Beiträge: 9
Registriert: Sonntag 17. Januar 2010, 18:59

Hallo!
Eine Einsteigerfrage:
Wie bekomme ich auf einfachste Weise die Anzahl der Ergebnisse bei einem Aufruf wie

Code: Alles auswählen

cursor.execute('select * from Users where email=?', (mail_addr,))
Ich möchte im Grunde überprüfen, ob ein Eintrag mit gegebener Emailadresse existiert oder nicht, folglich ob ich gar kein Ergebnis oder eben eines (oder gar mehrere) bekomme.
Ich verstehe dass man den cursor zum Durchiterieren nutzen kann, und ich könnte folglich eine Variable auf 0 setzen, dann durch alle Ergebnisse iterieren und die Variable hochzählen lassen, hinterher wüsste ich die Anzahl der Ergebnisse. Aber das muss ja sicherlich auch einfacher gehen?
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Hallo!

Da solltest du wohl noch einmal das Tutorial lesen.

Code: Alles auswählen

results = cursor.fetchall()
print len(results)
Das Leben ist wie ein Tennisball.
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Ich würd auch nen count(spalte) nehmen, anstatt ein select * ;-) Wozu die 100000 Emails-Adressen plus andere Attribute zurückliefern lassen, die man nicht braucht?
jovica.aleksic
User
Beiträge: 9
Registriert: Sonntag 17. Januar 2010, 18:59

Danke!
Tutorial........schaue ich mir ständig an, hier und dort, aber ich bin nicht jemand der sowas von A bis Z lesen kann, persönliches Manko. Jeder lernt anders, und ich könnte zB statt SVN zu nutzen immernoch das Tutorial lesen :D Oder eben PHP, ActionScript etc..
Bitte nicht böse sein bei dummen Fragen, man kann ja zB auch eine Antwort verweigern wenn einem die Frage nicht einer fairen Antwort würdig erscheint.

Btw, war über

Code: Alles auswählen

cursor.rowcount
gestolpert - sollte das auch das gewünschte Ergebnis liefern? ...Ach naja, teste ich sobald ein paar Daten in der DB stecken.
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Wieso nicht ein einfaches?

Code: Alles auswählen

select count(email)
from tabelle
where email='irgend eine mail adresse';
Worin siehst Du den "Vorteil" von "select *" und dem Abfragen der Ergebnis-Länge?
jovica.aleksic
User
Beiträge: 9
Registriert: Sonntag 17. Januar 2010, 18:59

Ich sehe gar keinen Vorteil, sondern bin einfach komplett ahnungslos :)
Ich bin an sich Frontend-Entwickler, und immer gab es einen PHP/SQL Experten an meiner Seite.
Hatte das in deiner ersten Antwort nicht ganz verstanden... Werde das Ganze morgen testen, jetzt ist erstmal bettzeit angesagt :) Aber danke für das wiederholte Nachhaken, weiß das zu schätzen!
Benutzeravatar
noisefloor
User
Beiträge: 3856
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: WW
Kontaktdaten:

Hallo,

es gibt halt zwei Möglichkeiten:

Wenn man es wie du macht ('SELECT * ...'), dann musst du auf Vorhandensein eines Ergebnisses prüfen. Weil wenn keine Mail-Adresse existiert, dann liefert SQL NULL zurück, was AFAIK die DBAPI in Python's None umwandelt.

Also:

Code: Alles auswählen

cursor.execute("SELECT * FROM tabelle WHERE email LIKE 'foorbar'")
ergebnis = cursor.fetchall()

if not ergebnis:
    print 'Keine E-Mail'
Wenn du count nimmt, dann kommt als Ergebnis nie NULL zurück, sondern immer eine Zahl, ggf. 0.

Code: Alles auswählen

cursor.execute("SELECT count(irgendwas) FROM tabelle WHERE email LIKE 'foorbar'")
ergebnis = cursor.fetchall()

if ergebnis == 0:
    print 'Keine E-Mail'
Gruß, noisefloor
BlackJack

@noisefloor: Ohne jetzt nachgeschaut zu haben dürfte `fetchall()` eine leere Liste liefern, wenn keine Datensätze da sind. `None` wäre eine ziemlich blöde Idee.
Benutzeravatar
noisefloor
User
Beiträge: 3856
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: WW
Kontaktdaten:

Hallo,

BlackJack hat geschrieben:@noisefloor: Ohne jetzt nachgeschaut zu haben dürfte `fetchall()` eine leere Liste liefern, wenn keine Datensätze da sind. `None` wäre eine ziemlich blöde Idee.
Es wird in der Tat eine leere Liste geliefert. Aber: es funktioniert. Gerade ausprobiert. :-)

Gruß, noisefloor
Antworten