mirror of
https://github.com/simonw/sqlite-utils.git
synced 2026-09-09 18:14:09 +02:00
table.create_index(columns, index_name) method
This commit is contained in:
parent
70e1f831a0
commit
4427d2d96f
3 changed files with 81 additions and 0 deletions
|
|
@ -204,3 +204,21 @@ If you insert additional records into the table you will need to refresh the sea
|
||||||
"is_good_dog": True,
|
"is_good_dog": True,
|
||||||
}, pk="id")
|
}, pk="id")
|
||||||
dogs.populate_fts(["name", "twitter"])
|
dogs.populate_fts(["name", "twitter"])
|
||||||
|
|
||||||
|
Creating indexes
|
||||||
|
================
|
||||||
|
|
||||||
|
You can create an index on a table using the ``.create_index(columns)`` method. The method takes a list of columns:
|
||||||
|
|
||||||
|
.. code-block:: python
|
||||||
|
|
||||||
|
dogs.create_index(["is_good_dog"])
|
||||||
|
|
||||||
|
By default the index will be named ``idx_{table-name}_{columns}`` - if you want to customize the name of the created index you can pass the ``index_name`` parameter::]
|
||||||
|
|
||||||
|
.. code-block:: python
|
||||||
|
|
||||||
|
dogs.create_index(
|
||||||
|
["is_good_dog", "age"],
|
||||||
|
index_name="good_dogs_by_age"
|
||||||
|
)
|
||||||
|
|
|
||||||
|
|
@ -140,6 +140,19 @@ class Table:
|
||||||
self.db.create_table(self.name, columns, pk=pk, foreign_keys=foreign_keys)
|
self.db.create_table(self.name, columns, pk=pk, foreign_keys=foreign_keys)
|
||||||
self.exists = True
|
self.exists = True
|
||||||
|
|
||||||
|
def create_index(self, columns, index_name=None):
|
||||||
|
if index_name is None:
|
||||||
|
index_name = "idx_{}_{}".format(
|
||||||
|
self.name.replace(" ", "_"), "_".join(columns)
|
||||||
|
)
|
||||||
|
sql = """
|
||||||
|
CREATE INDEX {index_name}
|
||||||
|
ON {table_name} ({columns});
|
||||||
|
""".format(
|
||||||
|
index_name=index_name, table_name=self.name, columns=", ".join(columns)
|
||||||
|
)
|
||||||
|
self.db.conn.execute(sql)
|
||||||
|
|
||||||
def drop(self):
|
def drop(self):
|
||||||
return self.db.conn.execute("DROP TABLE {}".format(self.name))
|
return self.db.conn.execute("DROP TABLE {}".format(self.name))
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1,4 +1,5 @@
|
||||||
from .fixtures import fresh_db
|
from .fixtures import fresh_db
|
||||||
|
from sqlite_utils.db import Index
|
||||||
import pytest
|
import pytest
|
||||||
import json
|
import json
|
||||||
|
|
||||||
|
|
@ -68,6 +69,55 @@ def test_create_table_works_for_m2m_with_only_foreign_keys(fresh_db):
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
|
@pytest.mark.parametrize(
|
||||||
|
"columns,index_name,expected_index",
|
||||||
|
(
|
||||||
|
(
|
||||||
|
["is_good_dog"],
|
||||||
|
None,
|
||||||
|
Index(
|
||||||
|
seq=0,
|
||||||
|
name="idx_dogs_is_good_dog",
|
||||||
|
unique=0,
|
||||||
|
origin="c",
|
||||||
|
partial=0,
|
||||||
|
columns=["is_good_dog"],
|
||||||
|
),
|
||||||
|
),
|
||||||
|
(
|
||||||
|
["is_good_dog", "age"],
|
||||||
|
None,
|
||||||
|
Index(
|
||||||
|
seq=0,
|
||||||
|
name="idx_dogs_is_good_dog_age",
|
||||||
|
unique=0,
|
||||||
|
origin="c",
|
||||||
|
partial=0,
|
||||||
|
columns=["is_good_dog", "age"],
|
||||||
|
),
|
||||||
|
),
|
||||||
|
(
|
||||||
|
["age"],
|
||||||
|
"age_index",
|
||||||
|
Index(
|
||||||
|
seq=0,
|
||||||
|
name="age_index",
|
||||||
|
unique=0,
|
||||||
|
origin="c",
|
||||||
|
partial=0,
|
||||||
|
columns=["age"],
|
||||||
|
),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
)
|
||||||
|
def test_create_index(fresh_db, columns, index_name, expected_index):
|
||||||
|
dogs = fresh_db["dogs"]
|
||||||
|
dogs.insert({"name": "Cleo", "twitter": "cleopaws", "age": 3, "is_good_dog": True})
|
||||||
|
assert [] == dogs.indexes
|
||||||
|
dogs.create_index(columns, index_name)
|
||||||
|
assert expected_index == dogs.indexes[0]
|
||||||
|
|
||||||
|
|
||||||
@pytest.mark.parametrize(
|
@pytest.mark.parametrize(
|
||||||
"data_structure",
|
"data_structure",
|
||||||
(
|
(
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue