Probleme mit Ausgabe von Datebsätzen bei Sqlite3

Installation und Anwendung von Datenbankschnittstellen wie SQLite, PostgreSQL, MariaDB/MySQL, der DB-API 2.0 und sonstigen Datenbanksystemen.
Antworten
pole23
User
Beiträge: 17
Registriert: Sonntag 18. Juli 2010, 12:06

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?
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

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 Leben ist wie ein Tennisball.
Benutzeravatar
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
Benutzeravatar
/me
User
Beiträge: 3556
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

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

Für die schnelle Problembehebung sieh dir bitte folgenden Code an:

Code: Alles auswählen

values = ('192.168.1.18', )
print values[0]
pole23
User
Beiträge: 17
Registriert: Sonntag 18. Juli 2010, 12:06

/me hat geschrieben:Arbeite bitte das Tutorial durch und schau dir auch an, wie die von dir verwendete Datenbankschnittstelle funktioniert.
Kannst du mir eins empfehlen?
Benutzeravatar
Rebecca
User
Beiträge: 1662
Registriert: Freitag 3. Februar 2006, 12:28
Wohnort: DN, Heimat: HB
Kontaktdaten:

Offizielles Python-Tutorial (Deutsche Version)

Urheberrecht, Datenschutz, Informationsfreiheit: Piratenpartei
ms4py
User
Beiträge: 1178
Registriert: Montag 19. Januar 2009, 09:37

Also ich würde das mit Tupel-Unpacking lösen:

Code: Alles auswählen

>>> ip, = ('192.168.1.18', )
>>> ip
'192.168.1.18'
Du solltest dich auf jeden Fall noch, wie schon vorgeschlagen, mit den Grundlagen auseinandersetzen (=> Tutorial).
„Lieber von den Richtigen kritisiert als von den Falschen gelobt werden.“
Gerhard Kocher

http://ms4py.org/
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

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'
Hm... schreibt man wirklich das Komma nach dem letzten Namen noch hin? Ist das so üblich in Python?
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
DasIch
User
Beiträge: 2718
Registriert: Montag 19. Mai 2008, 04:21
Wohnort: Berlin

Hyperion hat geschrieben:Hm... schreibt man wirklich das Komma nach dem letzten Namen noch hin? Ist das so üblich in Python?
Kann man bei einem Element machen, allerdings würde ich statt dessen eher direkt über den Index auf das Element zugreifen.
Benutzeravatar
/me
User
Beiträge: 3556
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

Hyperion hat geschrieben:
ms4py hat geschrieben:

Code: Alles auswählen

>>> ip, = ('192.168.1.18', )
>>> ip
'192.168.1.18'
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.
BlackJack

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

BlackJack hat geschrieben:Also ich finde Tupel-unpacking mit nur einem Namen zu subtil. Das übersieht man schnell.
Volle Zustimmung. Das ist hässlich.
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

BlackJack 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.
Ja, hab es tatsächlich in dem Moment nicht gerafft. Ich schiebs mal auf den Sommer :oops:

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
Benutzeravatar
noisefloor
User
Beiträge: 3856
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
Benutzeravatar
noisefloor
User
Beiträge: 3856
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:

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()
Gruß, noisefloor
Antworten