Hilfe Datenbankabfrage

Installation und Anwendung von Datenbankschnittstellen wie SQLite, PostgreSQL, MariaDB/MySQL, der DB-API 2.0 und sonstigen Datenbanksystemen.
Antworten
marcoh242
User
Beiträge: 3
Registriert: Donnerstag 8. August 2013, 09:43

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

Zuletzt geändert von marcoh242 am Donnerstag 8. August 2013, 10:23, insgesamt 2-mal geändert.
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Das müßte einen Traceback liefern. (den immer bei Fragen mit einfügen) Schau dir mal die Variable "i" an...

GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
marcoh242
User
Beiträge: 3
Registriert: Donnerstag 8. August 2013, 09:43

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?
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.
marcoh242
User
Beiträge: 3
Registriert: Donnerstag 8. August 2013, 09:43

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?
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

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

GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
Benutzeravatar
cofi
Python-Forum Veteran
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

Und dann hat man noch den Bonus auch nicht ueber das Ende zu iterieren. Mit anderen Worten: Warum will man es sich schwer machen?
Antworten