Seite 1 von 1

Hilfe Datenbankabfrage

Verfasst: Donnerstag 8. August 2013, 09:51
von marcoh242
Und zwar habe ich eine SQLite3 Datenbank , welche id, telefonnummer und email beinhaltet und eine Liste mit Telefonnummern.
Mein Ziel ist es die Telefonnummer aus meiner Liste mit der in der Datenbank abzufragen und die dazugehörige E-Mail Adresse in eine neue Liste zu speichern.
Mein Ansatz war dieser hier , komme aber nicht weiter :

Code: Alles auswählen

#Verbindung zur SQLite3 Datenbank
connection = sqlite3.connect(datenbankpfad)
print colored("Datenbankverbindung hergestellt", 'red')
connection.row_factory = zeilen_dict
connection.text_factory = str
cursor = connection.cursor()
cursor.execute("SELECT * FROM nutzerdaten ")
i = 0
email = []
for row in list(cursor):
    if newlist[i][0] == row['nummer']:
        email.append(row['email'])
        i = i + 1


Re: Hilfe Datenbankabfrage

Verfasst: Donnerstag 8. August 2013, 10:09
von jens
Das müßte einen Traceback liefern. (den immer bei Fragen mit einfügen) Schau dir mal die Variable "i" an...

Re: Hilfe Datenbankabfrage

Verfasst: Donnerstag 8. August 2013, 10:23
von marcoh242
i ist natürlich intialisiert , hab nur vergessen die Zeile zu kopieren.
Einmal geht der Code ja auch in die If Schleife rein und schreibt die Email Adresse in die Liste , aber wie kann ich es bewerkstelligen , dass er die nächste Tel.Nummer aus der Liste mit der in der DB vergleicht und mir die Email wiedergibt?

Re: Hilfe Datenbankabfrage

Verfasst: Donnerstag 8. August 2013, 10:47
von BlackJack
@marcoh242: http://if-schleife.de/

Spiel das mal auf einem Blatt Papier durch. Ich denke nicht das der Code das macht was Du willst. Da spielt ja auch die Reihenfolge der beiden Listen eine Rolle.

Bei Datenbankanfragen sollte man sich das * verkneifen und explizit hinschreiben was man gerne haben möchte. Du entschärfst die Probleme die durch das '*' entstehen ein wenig durch den Wert für `row_factory`, aber eigentlich könnte man Nummer und Email selektieren und ``for nummer, email in cursor:`` schreiben. Oder man macht gleich ein ``nummer2email = dict(cursor)`` und kann dann ganz einfach zu jeder Nummer die E-Mail-Adresse nachschlagen.

Falls `newlist` nicht zu lang ist, kann man das ganze auch gleich in der Datenbank mit dem ``IN``-Operator von SQL erledigen lassen und sich nur die E-Mail-Adressen geben lassen, zu denen es Nummern gibt.

Das `i` manuell initialisieren und hochzählen zu müssen ist umständlich und fehleranfällig. Für so etwas gibt es die `enumerate()`-Funktion. Normalerweise versucht man aber in Python Indexzugriffe zu vermeiden, weil sie in der Regel nicht nötig sind.

Re: Hilfe Datenbankabfrage

Verfasst: Donnerstag 8. August 2013, 12:17
von marcoh242
Habt natürlich recht , dass If eine Abfrage ist.

Hab beim Mittagessen ein bisschen nachgedacht und rausgekommen ist das:

Code: Alles auswählen

#Verbindung zur SQLite3 Datenbank
connection = sqlite3.connect(datenbankpfad)
print colored("Datenbankverbindung hergestellt", 'red')
connection.row_factory = zeilen_dict
connection.text_factory = str
cursor = connection.cursor()
#cursor.execute("SELECT email, nummer FROM nutzerdaten")

for i in range(zaehler):

    for row in cursor.execute("SELECT email, nummer FROM nutzerdaten WHERE nummer =?", (newlist[i][0], )):
        email.append(row['email'])
zaehler beinhaltet die Anzahl der Werte in newlist.


Ich beschäftige mich mit Python seit dieser Woche und kann nicht ganz nachvollziehen warum man bei Python Indexzugriffe vermeiden sollte , könntest du mir das vielleicht kurz erläutern?

Re: Hilfe Datenbankabfrage

Verfasst: Donnerstag 8. August 2013, 12:29
von jens
marcoh242 hat geschrieben:Ich beschäftige mich mit Python seit dieser Woche und kann nicht ganz nachvollziehen warum man bei Python Indexzugriffe vermeiden sollte , könntest du mir das vielleicht kurz erläutern?
Das wäre mal ein Punkt für die http://wiki.python-forum.de/FAQ :lol:

Man braucht i.d.R. keinen Index-Zugriff, weil man einfach drüber iterieren kann.

Beispiel (schlecht):

Code: Alles auswählen

for i in xrange(len(meine_liste)):
    print meine_liste[i]
besser/einfacher/direkter:

Code: Alles auswählen

for listen_punkt in meine_liste:
    print listen_punkt

Re: Hilfe Datenbankabfrage

Verfasst: Donnerstag 8. August 2013, 14:17
von cofi
Und dann hat man noch den Bonus auch nicht ueber das Ende zu iterieren. Mit anderen Worten: Warum will man es sich schwer machen?