2016-04-05 6 views
3

Согласно answer to another question, в sqlite расстояние Levenshtein реализовано в функции SQL, которая называется editdist3. (Сравните также documentation)Как использовать editdist3 в sqlite

Теперь, когда я пытаюсь использовать его, все это я получаю ошибку, что не существует:

╰┄┄> 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 

Я использую SQLite-3.11.1 на Gentoo Linux с (по умолчанию) флажками USE icu, readline и secure-delete.

ответ

2

Оказывается, editdist3 содержится в расширении sqlite, которое должно быть загружено явно. Поскольку я не нашел его в пакете sqlite Gentoo, мне также пришлось его самостоятельно создать. Как documentation говорит: виртуальная таблица

spellfix1 не входит в SQLite укрупнение и не является частью какой-либо стандартной SQLite сборки. Это загружаемое расширение .

Сначала я принес исходный код

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

, то он должен быть составлен

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

и, наконец, он может быть загружен с

.load ./spellfix 

Обратите внимание, что SQLite автоматически добавляет расширение .so.

Чтобы использовать его в Python - который был моим первоначальным намерением - следующие потребности предстоит сделать:

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

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