DB API - Parameter übergeben

Installation und Anwendung von Datenbankschnittstellen wie SQLite, PostgreSQL, MariaDB/MySQL, der DB-API 2.0 und sonstigen Datenbanksystemen.
Antworten
Benutzeravatar
noisefloor
User
Beiträge: 4192
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: WW
Kontaktdaten:

Hallo,

eine Parameter an einen (My)SQL-Query kann man ja so übergeben:

Code: Alles auswählen

cursor.execute("SELECT * FROM foo WHERE bar LIKE %s", begriff)
übergeben.

Aber wie funktioniert dass bei Volltextsuche, also wie baut man dafür den folgenden SQL-Query?

Code: Alles auswählen

SELECT * FROM foo WHERE bar LIKE '%begriff%'
Gruß, noisefloor
Zuletzt geändert von noisefloor am Montag 5. Juli 2010, 20:43, insgesamt 1-mal geändert.
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Ich verstehe die Frage jetzt irgend wie nicht... Du kannst doch in "begriff" in deinem 1. Beispiel alles möglich reinschreiben als String? Order irre ich da?
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
Benutzeravatar
cofi
Python-Forum Veteran
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

Und wenn es doch in den String soll hilft "%%".
Benutzeravatar
noisefloor
User
Beiträge: 4192
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: WW
Kontaktdaten:

Hallo,

ok, was nicht funktioniert ist:

Code: Alles auswählen

cursor.execute("SELECT * FROM foo WHERE bar LIKE %%s%", begriff)
Und auch alles, was ich sonst so probiert habe (z.B. %%%s%%% oder %%%s%) funzt nicht.

Die "normale" String-Ersetzung funktioniert schon, aber die soll man ja wegen unsicher nicht nehmen, sondern den Weg gem. DB API, s.o.

Gruß, noisefloor
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Wieso muss denn das "%" im Query-String stehen?!? Packe das doch in den Parameter rein! Damit bist Du auch viel flexibler... kann ja sein, dass man noch in der Mitte vom Suchbegriff ein "%" haben möchte ;-)

Außerdem solltest Du auf die Anzahl der "%" achten:

Code: Alles auswählen

cursor.execute("SELECT * FROM foo WHERE bar LIKE %%%s%%", begriff)
Du willst vor dem "%s" ein "%"-Zeichen -> 2x "%" tippen. Danach das gleiche... imho sollte das klappen
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: 4192
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: WW
Kontaktdaten:

Hallo,

@hyperion: So funktioniert es (habe wohl zu kompliziert gedacht...)

Also wenn man vorher

Code: Alles auswählen

begriff = '%'+begriff+'%'
macht hat man die Volltextsuche.

Interessant wäre trotzdem, ob dass der einzige (und Korrekte) weg ist...

EDIT: %%%s%% funktioniert nicht... IMHO deshalb, weil SQL das 1. und letzte % in Quotes haben will... IMHO kommt hier aber sowas wie %"begriff"% raus -> SQL-Error.

Gruß, noisefloor
rads
User
Beiträge: 153
Registriert: Freitag 26. März 2010, 15:51

An sich ist das eine simple Lösung die gut funktionieren sollte.
Leider ist die like - suche relativ langsam, wenn ich das so sagen
darf.

Man könnte überlegen ob man eine Tabelle mit Suchwörtern verwaltet.

Grob angedacht, wird für jedes Suchwort, typischerweise Subjektive,
beim Insert/modify ermittelt und in der Suchtabelle mit Referenz auf
die ID gespeichert. Über die Suchwörter wird ein Index erstellt.

Da meistens nach subjektiven gesucht wird, könnte man hier eine
Leistungssteigerung beim Suchen erreichen, Ändern und Einfügen von
Datensätzen wäre aber natürlich langsamer.

Wobei die Auwahl der Suchbegriffe wohl nicht ganz trivial ist und ist
der Suchaufwand bei Begriffen die nicht in der Suchtabelle sind höher.

Ob der Lösungsansatz überhaupt Sinn macht hängt von der Detaillösung ab,
und so ist das vielleicht schon mit Kanonen auf Spatzen schießen.

Grüße Stefan

p.s. bei mir funktioniert die Lösung von hyperion (mit einer Postgres) auch
Benutzeravatar
noisefloor
User
Beiträge: 4192
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: WW
Kontaktdaten:

Hallo,

klar kostet Volltext-Suche viel.

Konkret wird hier primär eine Spalte mit Feldlänge 500, Typ varchar durchsucht.

Ist in meinem Fall über überhaupt kein Performance-Problem, weil die Applikation im Intranet läuft und die DB so wie so weniger als 1 Query/Minute hat...

"In the wild" sollte man aber mit der

Code: Alles auswählen

... LIKE "%suchwort%"
Suche sparsam sein.

Gruß, noisefloor
Antworten