Hallo zusammen,
ich hajetz mal angefangen, mich mit dem Zugriff auf Datenbanken unter Python zu beschäftigen. Das erstellen und befüllen von Tabellen ist soweit kein Problem. Jedoch habe ich eine Spalte, wo IP Adressen als Text hinterlegt sind. Diese möchte ich mit einer Eingabe überprüfen lassen, ob sich sie eingegebene IP Adresse in der Datenbank befindet. Wenn ich mir den Datensatz auslesen lasse, dann erhalte ich folgende Ausgabe:
('192.168.1.18',)
So kann ich das schlecht mit einer Eingabe vergleichen. Gibt es einen Weg, das ich als Ausgabe aus einer Datenbank nur den Wert, also 192.168.1.18 erhalte?
Probleme mit Ausgabe von Datebsätzen bei Sqlite3
Hallo.
Das ist ein Tupel. Auf das erste Element kannst du ganz normal mit einem Index zugreifen. Wenn dir das nicht klar sein sollte, dann empfehle ich noch eine Runde Tutoriallesen.
Sebastian
Das ist ein Tupel. Auf das erste Element kannst du ganz normal mit einem Index zugreifen. Wenn dir das nicht klar sein sollte, dann empfehle ich noch eine Runde Tutoriallesen.
Sebastian
Das Leben ist wie ein Tennisball.
- Rebecca
- User
- Beiträge: 1662
- Registriert: Freitag 3. Februar 2006, 12:28
- Wohnort: DN, Heimat: HB
- Kontaktdaten:
Was du da bekommst, ist ein Tupel, von dem du nun das erste Element haben willst...
Offizielles Python-Tutorial (Deutsche Version)
Urheberrecht, Datenschutz, Informationsfreiheit: Piratenpartei
Urheberrecht, Datenschutz, Informationsfreiheit: Piratenpartei
Das sieht aus, als ob du ein Tupel mit den abgefragten Werten zurückbekommst. Arbeite bitte das Tutorial durch und schau dir auch an, wie die von dir verwendete Datenbankschnittstelle funktioniert.pole23 hat geschrieben:('192.168.1.18',)
So kann ich das schlecht mit einer Eingabe vergleichen. Gibt es einen Weg, das ich als Ausgabe aus einer Datenbank nur den Wert, also 192.168.1.18 erhalte?
Für die schnelle Problembehebung sieh dir bitte folgenden Code an:
Code: Alles auswählen
values = ('192.168.1.18', )
print values[0]
- Rebecca
- User
- Beiträge: 1662
- Registriert: Freitag 3. Februar 2006, 12:28
- Wohnort: DN, Heimat: HB
- Kontaktdaten:
Das offizielle Tutorial.
Offizielles Python-Tutorial (Deutsche Version)
Urheberrecht, Datenschutz, Informationsfreiheit: Piratenpartei
Urheberrecht, Datenschutz, Informationsfreiheit: Piratenpartei
Also ich würde das mit Tupel-Unpacking lösen:
Du solltest dich auf jeden Fall noch, wie schon vorgeschlagen, mit den Grundlagen auseinandersetzen (=> Tutorial).
Code: Alles auswählen
>>> ip, = ('192.168.1.18', )
>>> ip
'192.168.1.18'
„Lieber von den Richtigen kritisiert als von den Falschen gelobt werden.“
Gerhard Kocher
http://ms4py.org/
Gerhard Kocher
http://ms4py.org/
- Hyperion
- Moderator
- Beiträge: 7478
- Registriert: Freitag 4. August 2006, 14:56
- Wohnort: Hamburg
- Kontaktdaten:
Hm... schreibt man wirklich das Komma nach dem letzten Namen noch hin? Ist das so üblich in Python?ms4py hat geschrieben:Also ich würde das mit Tupel-Unpacking lösen:
Code: Alles auswählen
>>> ip, = ('192.168.1.18', ) >>> ip '192.168.1.18'
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
assert encoding_kapiert
Kann man bei einem Element machen, allerdings würde ich statt dessen eher direkt über den Index auf das Element zugreifen.Hyperion hat geschrieben:Hm... schreibt man wirklich das Komma nach dem letzten Namen noch hin? Ist das so üblich in Python?
Angesichts dessen was du bekommst wenn du es weglässt: Ja.Hyperion hat geschrieben:Hm... schreibt man wirklich das Komma nach dem letzten Namen noch hin? Ist das so üblich in Python?ms4py hat geschrieben:Code: Alles auswählen
>>> ip, = ('192.168.1.18', ) >>> ip '192.168.1.18'
Also ich finde Tupel-unpacking mit nur einem Namen zu subtil. Das übersieht man schnell. Hyperion's Antwort stützt das IMHO, denn er ist ja nicht gerade Anfänger und hat's anscheinend auch nicht sofort verstanden.
- Hyperion
- Moderator
- Beiträge: 7478
- Registriert: Freitag 4. August 2006, 14:56
- Wohnort: Hamburg
- Kontaktdaten:
Ja, hab es tatsächlich in dem Moment nicht gerafft. Ich schiebs mal auf den SommerBlackJack hat geschrieben:Also ich finde Tupel-unpacking mit nur einem Namen zu subtil. Das übersieht man schnell. Hyperion's Antwort stützt das IMHO, denn er ist ja nicht gerade Anfänger und hat's anscheinend auch nicht sofort verstanden.

Ich selber habs aber bisher auch immer über Indexzugriff gelöst.
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
assert encoding_kapiert
- noisefloor
- User
- Beiträge: 4149
- Registriert: Mittwoch 17. Oktober 2007, 21:40
- Wohnort: WW
- Kontaktdaten:
Hallo,
@pole23: Wenn du mit Python-Modulen, die der Python DB API 2.0 folgen (was eigentlich die meisten tun) auf eine DB zugreifst, bekommst du immer ein Tuple oder eine Tuple von Tuplen (oder eine Liste von Tuplen) als Ergebnis zurück. Daher solltest du dich mit dem Zugriff auf Tuple / Listen beschäfitgen (muss du aber so oder so, wenn du effektiv mit Python arbeiten willst
).
Ein Tuple mit nur einem Wert als Inhalt mag zwar so wenig sinnvoll erscheinen, aber sobald du ein Ergebnis mit mehreren Werten bekommst macht das durchaus Sinn. Z.B. weil du dann direkt über die Ergebnisse iterieren kannst.
Gruß, noisefloor
@pole23: Wenn du mit Python-Modulen, die der Python DB API 2.0 folgen (was eigentlich die meisten tun) auf eine DB zugreifst, bekommst du immer ein Tuple oder eine Tuple von Tuplen (oder eine Liste von Tuplen) als Ergebnis zurück. Daher solltest du dich mit dem Zugriff auf Tuple / Listen beschäfitgen (muss du aber so oder so, wenn du effektiv mit Python arbeiten willst

Ein Tuple mit nur einem Wert als Inhalt mag zwar so wenig sinnvoll erscheinen, aber sobald du ein Ergebnis mit mehreren Werten bekommst macht das durchaus Sinn. Z.B. weil du dann direkt über die Ergebnisse iterieren kannst.
Gruß, noisefloor
- noisefloor
- User
- Beiträge: 4149
- Registriert: Mittwoch 17. Oktober 2007, 21:40
- Wohnort: WW
- Kontaktdaten:
Hallo,
BTW, wenn du "nur" wissen willst, ob ein Wert in einer DB ist oder nicht, dann brauchst du das Ergebnis nicht wirklich auswerten, es reicht der Rückgabewert des 'execute'-Statements:
Gruß, noisefloor
BTW, wenn du "nur" wissen willst, ob ein Wert in einer DB ist oder nicht, dann brauchst du das Ergebnis nicht wirklich auswerten, es reicht der Rückgabewert des 'execute'-Statements:
Code: Alles auswählen
import sqlite3
conn = sqlite3.connect('meinedb.db')
c = conn.cursor()
if c.execute("SELECT true FROM meinetablelle WHERE ip = 'meineIP'"):
print 'IP vorhanden'
else:
print 'IP nicht vorhanden'
conn.close()