DescIndex(column) for descending index columns, refs #260

This commit is contained in:
Simon Willison 2021-05-28 21:32:03 -07:00
commit c374d7ef04
3 changed files with 37 additions and 1 deletions

View file

@ -1866,6 +1866,17 @@ By default the index will be named ``idx_{table-name}_{columns}`` - if you want
index_name="good_dogs_by_age" index_name="good_dogs_by_age"
) )
To create an index in descending order for a column, wrap the column name in ``db.DescIndex()`` like this:
.. code-block:: python
from sqlite_utils.db import DescIndex
db["dogs"].create_index(
["is_good_dog", DescIndex("age")],
index_name="good_dogs_by_age"
)
You can create a unique index by passing ``unique=True``: You can create a unique index by passing ``unique=True``:
.. code-block:: python .. code-block:: python

View file

@ -144,6 +144,10 @@ class InvalidColumns(Exception):
pass pass
class DescIndex(str):
pass
_COUNTS_TABLE_CREATE_SQL = """ _COUNTS_TABLE_CREATE_SQL = """
CREATE TABLE IF NOT EXISTS [{}]( CREATE TABLE IF NOT EXISTS [{}](
[table] TEXT PRIMARY KEY, [table] TEXT PRIMARY KEY,
@ -1156,6 +1160,13 @@ class Table(Queryable):
index_name = "idx_{}_{}".format( index_name = "idx_{}_{}".format(
self.name.replace(" ", "_"), "_".join(columns) self.name.replace(" ", "_"), "_".join(columns)
) )
columns_sql = []
for column in columns:
if isinstance(column, DescIndex):
fmt = "[{}] desc"
else:
fmt = "[{}]"
columns_sql.append(fmt.format(column))
sql = ( sql = (
textwrap.dedent( textwrap.dedent(
""" """
@ -1167,7 +1178,7 @@ class Table(Queryable):
.format( .format(
index_name=index_name, index_name=index_name,
table_name=self.name, table_name=self.name,
columns=", ".join("[{}]".format(c) for c in columns), columns=", ".join(columns_sql),
unique="UNIQUE " if unique else "", unique="UNIQUE " if unique else "",
if_not_exists="IF NOT EXISTS " if if_not_exists else "", if_not_exists="IF NOT EXISTS " if if_not_exists else "",
) )

View file

@ -1,6 +1,7 @@
from sqlite_utils.db import ( from sqlite_utils.db import (
Index, Index,
Database, Database,
DescIndex,
ForeignKey, ForeignKey,
AlterError, AlterError,
NoObviousTable, NoObviousTable,
@ -739,6 +740,19 @@ def test_create_index_if_not_exists(fresh_db):
dogs.create_index(["name"], if_not_exists=True) dogs.create_index(["name"], if_not_exists=True)
def test_create_index_desc(fresh_db):
dogs = fresh_db["dogs"]
dogs.insert({"name": "Cleo", "twitter": "cleopaws", "age": 3, "is good dog": True})
assert [] == dogs.indexes
dogs.create_index([DescIndex("age"), "name"])
sql = fresh_db.execute(
"select sql from sqlite_master where name='idx_dogs_age_name'"
).fetchone()[0]
assert sql == (
"CREATE INDEX [idx_dogs_age_name]\n" " ON [dogs] ([age] desc, [name])"
)
@pytest.mark.parametrize( @pytest.mark.parametrize(
"data_structure", "data_structure",
( (