Added create_index(..., if_not_exists=True), refs #14

This commit is contained in:
Simon Willison 2019-02-24 10:46:44 -08:00
commit 7784b924a1
3 changed files with 18 additions and 3 deletions

View file

@ -394,6 +394,8 @@ You can create a unique index by passing ``unique=True``::
dogs.create_index(["name"], unique=True)
Use ``if_not_exists=True`` to do nothing if an index with that name already exists.
Vacuum
======

View file

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

View file

@ -1,9 +1,10 @@
from sqlite_utils.db import Index, Database
import collections
import datetime
import json
import pathlib
import pytest
import json
import sqlite3
try:
import pandas as pd
@ -188,6 +189,17 @@ def test_create_index_unique(fresh_db):
)
def test_create_index_if_not_exists(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"])
assert 1 == len(dogs.indexes)
with pytest.raises(sqlite3.OperationalError):
dogs.create_index(["name"])
dogs.create_index(["name"], if_not_exists=True)
@pytest.mark.parametrize(
"data_structure",
(