2016-04-05 15 views
3

Nach einem answer to another question, in SQLite ist Levenshtein Abstand in einer SQL-Funktion namens editdist3 implementiert. (Vergleiche auch die documentation)So verwenden Sie editdist3 in sqlite

Jetzt, wenn ich versuche, es zu benutzen, alles, was ich bekommen, ist ein Fehler, dass es nicht existiert:

╰┄┄> sqlite3 
SQLite version 3.11.1 2016-03-03 16:17:53 
Enter ".help" for usage hints. 
Connected to a transient in-memory database. 
Use ".open FILENAME" to reopen on a persistent database. 
sqlite> CREATE TABLE test (col1 TEXT); 
sqlite> INSERT INTO test VALUES ('foobar'); 
sqlite> SELECT * FROM test WHERE editdist3(col1, 'f00bar') < 3; 
Error: no such function: editdist3 

Ich verwende SQLite-3.11.1 auf Gentoo Linux mit (Standard) USE-Flags icu, readline und secure-delete.

Antwort

2

Es stellt sich heraus editdist3 ist in einer SQLite-Erweiterung enthalten, die explizit geladen werden muss. Da ich es im Gentoo sqlite-Paket nicht gefunden habe, musste ich es auch selbst bauen. Wie die documentation sagt:

Die spellfix1 virtuelle Tabelle ist in der SQLite Verschmelzung nicht enthält und ist nicht Bestandteil von jedem Standard-SQLite-Build. Es ist eine ladbare Erweiterung.

Zuerst holte ich den Quellcode

wget https://sqlite.org/2016/sqlite-src-3110100.zip 
unzip sqlite-src-3110100.zip 

dann muss es

gcc -shared -fPIC -Wall -Isqlite-src-3110100 sqlite-src-3110100/ext/misc/spellfix.c -o spellfix.so 

kompiliert werden und schließlich kann es mit

.load ./spellfix 

Beachten Sie, dass automatisch sqlite geladen werden hängt die Erweiterungan.

Um es in Python zu verwenden - die meine ursprüngliche Absicht war - die folgenden getan werden muss:

db = sqlite3.connect(':memory:') 

db.enable_load_extension(True) 
db.load_extension('./spellfix') 
db.enable_load_extension(False)