我在我的Debian上的linux2上使用Python 2.7.6(默认,2014年3月22日,22:59:56)[GCC 4.8.2],我通常使用模块sqlite3没有任何问题.
我编译了一个Sqlite扩展 spellfix,加载时出现此错误:
sqlite3.OperationalError:./spellfix.so:未定义的符号:sqlite3_malloc64
我想这可能是因为sqlite3模块太旧了:
import sqlite3
print sqlite3.version # 2.6.0
print sqlite3.sqlite_version # 3.8.2
Run Code Online (Sandbox Code Playgroud)
(在sqlite3.sqlite_version3.8.7.x的另一台机器上,扩展加载正常).
我试过了:
pip install --upgrade pysqlite
Run Code Online (Sandbox Code Playgroud)
但它仍然是相同的:sqlite3.sqlite_version保持3.8.2.
如何升级Python sqlite3模块(内置于标准库中)?
我正在尝试实施“您的意思是?” 某种搜索功能。
我正在尝试使用使用ruby编写的levenshtein函数进行查询。我想知道如何在sqlite3查询中使用此功能。我在想可能是这样的:
@results = the_db.where('levenshtein(name, ?) <= 3', searchphrase)
但是我不确定如何使它工作。有人可以帮我吗?
我正在使用 sqlite3 数据库开发 django 应用程序,该应用程序具有固定的数据库内容。固定我的意思是数据库的内容不会随着时间的推移而改变。该模型是这样的:
class QScript(models.Model):
ch_no = models.IntegerField()
v_no = models.IntegerField()
v = models.TextField()
Run Code Online (Sandbox Code Playgroud)
表中有大约 6500 条记录。给定一个可能缺少某些单词或拼写错误的文本,我需要确定它的ch_no和v_no。例如,如果vdb 中有一个字段,其中包含文本"This is an example verse",则给定的文本,如"This an egsample verse"应该给我ch_no和v_nofrom db。我相信这可以使用全文搜索来完成。
全文搜索可以做到这一点吗?根据我的研究,我猜测它可以,正如在sqlite3 页面中所说:全文搜索是“Google、Yahoo 和 Bing 对放置在万维网上的文档所做的事情”。在 SO 中引用,我也阅读了这篇文章以及许多其他文章,但没有找到任何与我的要求非常匹配的内容。
如何在 Django 模型中使用 FTS?我读了这个,但没有帮助。似乎太过时了。在此处阅读:“...需要直接操作数据库以添加全文索引”。搜索主要提供与 MySQL 相关的信息,但我需要在 sqlite3 中进行。那么如何在 sqlite3中进行直接操作呢?
我选择坚持使用 sqlite3 是否正确?或者我应该使用不同的东西(比如 …
根据对另一个问题的回答,在 sqlite 中,Levenshtein 距离是在名为editdist3. (也比较文档)
现在,当我尝试使用它时,我得到的只是它不存在的错误:
???> 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
Run Code Online (Sandbox Code Playgroud)
我在 Gentoo Linux 上使用 sqlite-3.11.1(默认) USE 标志icu,readline和secure-delete …
假设我们有100万行像这样:
import sqlite3
db = sqlite3.connect(':memory:')
c = db.cursor()
c.execute('CREATE TABLE mytable (id integer, description text)')
c.execute('INSERT INTO mytable VALUES (1, "Riemann")')
c.execute('INSERT INTO mytable VALUES (2, "All the Carmichael numbers")')
Run Code Online (Sandbox Code Playgroud)
我知道如何用Sqlite做到这一点:
找到一个单字查询的行,最多有一些拼写错误与spellfix模块和Levenshtein距离(我在这里发布了一个详细的答案,关于如何编译它,如何使用它,...):
db.enable_load_extension(True)
db.load_extension('./spellfix')
c.execute('SELECT * FROM mytable WHERE editdist3(description, "Riehmand") < 300'); print c.fetchall()
#Query: 'Riehmand'
#Answer: [(1, u'Riemann')]
Run Code Online (Sandbox Code Playgroud)
使用1M行,这将是超级慢!如此处详述,postgresql可能会对此进行优化trigrams.Sqlite提供的快速解决方案是使用VIRTUAL TABLE USING spellfix:
c.execute('CREATE VIRTUAL TABLE mytable3 USING spellfix1')
c.execute('INSERT …Run Code Online (Sandbox Code Playgroud)