ubuntuusers.de

Python: Nach Suchbegriff in SQLite Datenbank suchen

Status: Gelöst | Ubuntu-Version: Ubuntu 10.10 (Maverick Meerkat)
Antworten |

Developer92 Team-Icon

Avatar von Developer92

Anmeldungsdatum:
31. Dezember 2008

Beiträge: 4101

Hey, ich hoffe mir kann da mal jemand helfen.

Und zwar gehts um folgendes:

Ich habe eine Datenbank in der eine Tabelle "files" ist. Diese hat zwei Spalten: "path" und "name"

Ich will nun in beiden Spalten nach einem Suchbegriff suchen.

Wobei es 2 Möglichkeiten geben soll:

1. Der Suchbegriff entspricht exakt einem Eintrag in der Tabelle "path" oder "spalte"

2. Der Suchbegriff kommt in "path" oder "name" vor, allerdings mit einem Zusatz (braucht man dafür WildCards?)

Ich habe bisher keine Möglichkeit gefunden, wie man suchen kann. Ich weiß, dass es über "SELECT name, path FROM files WHERE <Bedingung>" gehen müsste. Aber nachdem ich alle möglichen und unmöglichen Kombinationen durchhatte, habe ich beschlossen, doch mal nachzufragen. Nicht, dass Python plötzlich keine Lust mehr hat. Ständig Error-Meldungen auszugeben ist auf Dauer ja auch langweilig.... 😉

mfg

Lysander

Avatar von Lysander

Anmeldungsdatum:
30. Juli 2008

Beiträge: 2669

Wohnort: Hamburg

Das ist eigentlich weniger ein Python, sondern viel mehr ein SQL-Problem 😉

Du suchst den SQL-Operator like! Schau dazu am besten in die SQLite-Doku, da wirds erklärt ☺

Wie Du Suchbegriffe dynamisch in Deine Query reinbekommst, ohne SQL-Injection gefahr ist Dir bekannt?

Developer92 Team-Icon

(Themenstarter)
Avatar von Developer92

Anmeldungsdatum:
31. Dezember 2008

Beiträge: 4101

Lysander schrieb:

Das ist eigentlich weniger ein Python, sondern viel mehr ein SQL-Problem 😉

Ja, da hast du gar nicht mal so unrecht. Allerdings ist mein Programm in Python, deshalb...

Wie Du Suchbegriffe dynamisch in Deine Query reinbekommst, ohne SQL-Injection gefahr ist Dir bekannt?

Du meinst mit (zum Beispiel) "INSERT INTO files VALUES(?, ?)", oder? Die Möglichkeit einer SQL-Injection will ich jetzt nicht unbedingt haben (by the way: Wie macht man ne SQL-Injection [Beispiel]?)

Ich such jetzt mal nach diesem "like" (Wusste gar nicht, dass es sowas gibt)

mfg

Lysander

Avatar von Lysander

Anmeldungsdatum:
30. Juli 2008

Beiträge: 2669

Wohnort: Hamburg

TDeveloper schrieb:

Du meinst mit (zum Beispiel) "INSERT INTO files VALUES(?, ?)", oder?

Jo 👍

Die Möglichkeit einer SQL-Injection will ich jetzt nicht unbedingt haben (by the way: Wie macht man ne SQL-Injection [Beispiel]?)

Guck mal auf wikipedia, da wird das iirc gut erklärt.

Developer92 Team-Icon

(Themenstarter)
Avatar von Developer92

Anmeldungsdatum:
31. Dezember 2008

Beiträge: 4101

Lysander schrieb:

TDeveloper schrieb:

Die Möglichkeit einer SQL-Injection will ich jetzt nicht unbedingt haben (by the way: Wie macht man ne SQL-Injection [Beispiel]?)

Guck mal auf wikipedia, da wird das iirc gut erklärt.

Ok. Dachte du könntest mir dazu ein wenig was sagen, evtl. aus der Erfahrung heraus 😉

Also, wegen der Suche: Ein 'SELECT path, name FROM files WHERE name="test.txt"' funktioniert wunderbar. Das Problem ist nur, wie bekomm ich anstatt dem text.txt ein Fragezeichen hin, ohne dass Python meckert? So wie bei 'INSERT .... VALUES(?)' ?

mfg

Lysander

Avatar von Lysander

Anmeldungsdatum:
30. Juli 2008

Beiträge: 2669

Wohnort: Hamburg

TDeveloper schrieb:

Lysander schrieb: Ok. Dachte du könntest mir dazu ein wenig was sagen, evtl. aus der Erfahrung heraus 😉

Ich kann es sicherlich nicht besser erklären, als es dort und in vielen guten web-Ressourcen beschrieben steht 😉

Also, wegen der Suche: Ein 'SELECT path, name FROM files WHERE name="test.txt"' funktioniert wunderbar. Das Problem ist nur, wie ich das ganze SQL-Injection-sicher mache. Ich meine, wie bekomm ich anstatt dem text.txt ein Fragezeichen hin, ohne dass Python meckert?

Ich sehe das like nicht?

Und was meinst Du genau? Wie meckert Python denn? Und was hast Du versucht?

Oben hattest Du mir doch schon ein korrektes Beispiel gepostet... (nebenbei wird das doch auch in der Doku erklärt)

Developer92 Team-Icon

(Themenstarter)
Avatar von Developer92

Anmeldungsdatum:
31. Dezember 2008

Beiträge: 4101

Lysander schrieb:

TDeveloper schrieb:

Lysander schrieb: Also, wegen der Suche: Ein 'SELECT path, name FROM files WHERE name="test.txt"' funktioniert wunderbar. Das Problem ist nur, wie ich das ganze SQL-Injection-sicher mache. Ich meine, wie bekomm ich anstatt dem text.txt ein Fragezeichen hin, ohne dass Python meckert?

Ich sehe das like nicht?

Jap, mit "like" siehts ja auch anders aus: 'SELECT path, name FROM files WHERE name LIKE "%project%"'

Du glaubs gar nicht was ich alles an Dateien rumliegen hab die "project" im Namen haben....

Und was meinst Du genau? Wie meckert Python denn? Und was hast Du versucht?

Okay, ich hab wie oben das Beispiel mit der Tabelle "files" und darin 2 Spalten (path und name).

Der Python-Code, den ich probiert habe sieht zum Beispiel so aus:

1
2
3
4
sql = 'SELECT path, name FROM files WHERE name=(?)'  # Alternativ auch: sql = 'SELECT path, name FROM files WHERE name LIKE (?)'
arg = 'project'
cursor.execute(sql, arg)
cursor.fetchall()

Wenn ich versuche den Suchbegriff irgendwie über den Fragezeichen-Operator zu übergeben, dann kommt gleich eine Fehlermeldung, die immer wie folgt aussieht:

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
sqlite3.ProgrammingError: Incorrect number of bindings supplied. The current statement uses 1, and there are 11 supplied.

Wobei die hintere Zahl (in diesem Falle "11") gerne variiert. Vorhin wars 14, jetzt ist es 11.

mfg

Lysander

Avatar von Lysander

Anmeldungsdatum:
30. Juli 2008

Beiträge: 2669

Wohnort: Hamburg

Ach so... also execute() erwartet ein Tupel als Parameter!

1
2
# sehr unangenehmer Fall der Python-Syntax: man beachte das Komma!
cursor.execute(sql, (arg,))

Das ist speziell bei einem Parameter echt ein Stolperstein 😉

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
In [3]: a = (4)

In [4]: type(a)
Out[4]: <type 'int'>

In [5]: a
Out[5]: 4

In [6]: a = (4, )

In [7]: type(a)
Out[7]: <type 'tuple'>

Aber wir wollen uns mal nicht beschweren; ansonsten ist die Python-Syntax ja wirklich einfach.

Developer92 Team-Icon

(Themenstarter)
Avatar von Developer92

Anmeldungsdatum:
31. Dezember 2008

Beiträge: 4101

Lysander schrieb:

Ach so... also execute() erwartet ein Tupel als Parameter!

Oh man, na dann ist es ja einfach

Das ist speziell bei einem Parameter echt ein Stolperstein 😉

Stimmt. Wollte das ganze mal mit einem Parameter testen und es ging nicht. Deswegen bin ich gleich auf 2 Parameter umgestiegen ☺

Aber wir wollen uns mal nicht beschweren; ansonsten ist die Python-Syntax ja wirklich einfach.

Richtig 👍

Auf jeden Fall DANKE. Jetzt funktioniert endlich meine simple Desktopsuchmaschine 😀

mfg

Antworten |