mirror of
https://github.com/simonw/sqlite-utils.git
synced 2026-09-27 20:34:12 +02:00
table.virtual_table_using property, closes #196
This commit is contained in:
parent
43eae8b193
commit
59d8689ed0
3 changed files with 81 additions and 1 deletions
|
|
@ -1430,6 +1430,12 @@ The ``detect_fts()`` method returns the associated SQLite FTS table name, if one
|
||||||
>> db["authors"].detect_fts()
|
>> db["authors"].detect_fts()
|
||||||
"authors_fts"
|
"authors_fts"
|
||||||
|
|
||||||
|
The ``.virtual_table_using`` property reveals if a table is a virtual table. It returns ``None`` for regular tables and the upper case version of the type of virtual table otherwise. For example::
|
||||||
|
|
||||||
|
>> db["authors"].enable_fts(["name"])
|
||||||
|
>> db["authors_fts"].virtual_table_using
|
||||||
|
"FTS5"
|
||||||
|
|
||||||
.. _python_api_fts:
|
.. _python_api_fts:
|
||||||
|
|
||||||
Enabling full-text search
|
Enabling full-text search
|
||||||
|
|
|
||||||
|
|
@ -10,12 +10,32 @@ import itertools
|
||||||
import json
|
import json
|
||||||
import os
|
import os
|
||||||
import pathlib
|
import pathlib
|
||||||
|
import re
|
||||||
import sys
|
import sys
|
||||||
import textwrap
|
import textwrap
|
||||||
import uuid
|
import uuid
|
||||||
|
|
||||||
SQLITE_MAX_VARS = 999
|
SQLITE_MAX_VARS = 999
|
||||||
|
|
||||||
|
_virtual_table_using_re = re.compile(
|
||||||
|
r"""
|
||||||
|
^ # Start of string
|
||||||
|
\s*CREATE\s+VIRTUAL\s+TABLE\s+ # CREATE VIRTUAL TABLE
|
||||||
|
(
|
||||||
|
'(?P<squoted_table>[^']*(?:''[^']*)*)' | # single quoted name
|
||||||
|
"(?P<dquoted_table>[^"]*(?:""[^"]*)*)" | # double quoted name
|
||||||
|
`(?P<backtick_table>[^`]+)` | # `backtick` quoted name
|
||||||
|
\[(?P<squarequoted_table>[^\]]+)\] | # [...] quoted name
|
||||||
|
(?P<identifier> # SQLite non-quoted identifier
|
||||||
|
[A-Za-z_\u0080-\uffff] # \u0080-\uffff = "any character larger than u007f"
|
||||||
|
[A-Za-z_\u0080-\uffff0-9\$]* # zero-or-more alphanemuric or $
|
||||||
|
)
|
||||||
|
)
|
||||||
|
\s+(IF\s+NOT\s+EXISTS\s+)? # IF NOT EXISTS (optional)
|
||||||
|
USING\s+(?P<using>\w+) # e.g. USING FTS5
|
||||||
|
""",
|
||||||
|
re.VERBOSE | re.IGNORECASE,
|
||||||
|
)
|
||||||
|
|
||||||
try:
|
try:
|
||||||
import pandas as pd
|
import pandas as pd
|
||||||
|
|
@ -676,6 +696,14 @@ class Table(Queryable):
|
||||||
)
|
)
|
||||||
return fks
|
return fks
|
||||||
|
|
||||||
|
@property
|
||||||
|
def virtual_table_using(self):
|
||||||
|
"Returns type of virtual table or None if this is not a virtual table"
|
||||||
|
match = _virtual_table_using_re.match(self.schema)
|
||||||
|
if match is None:
|
||||||
|
return None
|
||||||
|
return match.groupdict()["using"].upper()
|
||||||
|
|
||||||
@property
|
@property
|
||||||
def indexes(self):
|
def indexes(self):
|
||||||
sql = 'PRAGMA index_list("{}")'.format(self.name)
|
sql = 'PRAGMA index_list("{}")'.format(self.name)
|
||||||
|
|
|
||||||
|
|
@ -1,4 +1,4 @@
|
||||||
from sqlite_utils.db import Index, View
|
from sqlite_utils.db import Index, View, Database
|
||||||
import pytest
|
import pytest
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -142,3 +142,49 @@ def test_triggers(fresh_db):
|
||||||
(t.name, t.table) for t in fresh_db["authors"].triggers
|
(t.name, t.table) for t in fresh_db["authors"].triggers
|
||||||
}
|
}
|
||||||
assert [] == fresh_db["other"].triggers
|
assert [] == fresh_db["other"].triggers
|
||||||
|
|
||||||
|
|
||||||
|
@pytest.mark.parametrize(
|
||||||
|
"sql,expected_name,expected_using",
|
||||||
|
[
|
||||||
|
(
|
||||||
|
"""
|
||||||
|
CREATE VIRTUAL TABLE foo USING FTS5(name)
|
||||||
|
""",
|
||||||
|
"foo",
|
||||||
|
"FTS5",
|
||||||
|
),
|
||||||
|
(
|
||||||
|
"""
|
||||||
|
CREATE VIRTUAL TABLE "foo" USING FTS4(name)
|
||||||
|
""",
|
||||||
|
"foo",
|
||||||
|
"FTS4",
|
||||||
|
),
|
||||||
|
(
|
||||||
|
"""
|
||||||
|
CREATE VIRTUAL TABLE IF NOT EXISTS `foo` USING FTS4(name)
|
||||||
|
""",
|
||||||
|
"foo",
|
||||||
|
"FTS4",
|
||||||
|
),
|
||||||
|
(
|
||||||
|
"""
|
||||||
|
CREATE VIRTUAL TABLE IF NOT EXISTS `foo` USING fts5(name)
|
||||||
|
""",
|
||||||
|
"foo",
|
||||||
|
"FTS5",
|
||||||
|
),
|
||||||
|
(
|
||||||
|
"""
|
||||||
|
CREATE TABLE IF NOT EXISTS `foo` (id integer primary key)
|
||||||
|
""",
|
||||||
|
"foo",
|
||||||
|
None,
|
||||||
|
),
|
||||||
|
],
|
||||||
|
)
|
||||||
|
def test_virtual_table_using(sql, expected_name, expected_using):
|
||||||
|
db = Database(memory=True)
|
||||||
|
db.execute(sql)
|
||||||
|
assert db[expected_name].virtual_table_using == expected_using
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue