Ability to create unique indexes, refs #14

This commit is contained in:
Simon Willison 2019-02-24 10:41:51 -08:00
commit e7ffbcdb36
3 changed files with 31 additions and 3 deletions

View file

@ -388,6 +388,13 @@ By default the index will be named ``idx_{table-name}_{columns}`` - if you want
index_name="good_dogs_by_age"
)
You can create a unique index by passing ``unique=True``::
.. code-block:: python
dogs.create_index(["name"], unique=True)
Vacuum
======

View file

@ -236,16 +236,19 @@ class Table:
self.exists = True
return self
def create_index(self, columns, index_name=None):
def create_index(self, columns, index_name=None, unique=False):
if index_name is None:
index_name = "idx_{}_{}".format(
self.name.replace(" ", "_"), "_".join(columns)
)
sql = """
CREATE INDEX {index_name}
CREATE {unique}INDEX {index_name}
ON {table_name} ({columns});
""".format(
index_name=index_name, table_name=self.name, columns=", ".join(columns)
index_name=index_name,
table_name=self.name,
columns=", ".join(columns),
unique="UNIQUE " if unique else "",
)
self.db.conn.execute(sql)
return self

View file

@ -170,6 +170,24 @@ def test_create_index(fresh_db, columns, index_name, expected_index):
assert expected_index == dogs.indexes[0]
def test_create_index_unique(fresh_db):
dogs = fresh_db["dogs"]
dogs.insert({"name": "Cleo", "twitter": "cleopaws", "age": 3, "is_good_dog": True})
assert [] == dogs.indexes
dogs.create_index(["name"], unique=True)
assert (
Index(
seq=0,
name="idx_dogs_name",
unique=1,
origin="c",
partial=0,
columns=["name"],
)
== dogs.indexes[0]
)
@pytest.mark.parametrize(
"data_structure",
(