Added db.index_foreign_keys() method plus test

This commit is contained in:
Simon Willison 2019-06-30 16:38:14 -07:00
commit 61164d98cf
3 changed files with 21 additions and 7 deletions

View file

@ -228,13 +228,7 @@ def index_foreign_keys(path):
Ensure every foreign key column has an index on it.
"""
db = sqlite_utils.Database(path)
for table_name in db.table_names():
table = db[table_name]
existing_indexes = {i.columns[0] for i in table.indexes if len(i.columns) == 1}
for fk in table.foreign_keys:
if fk.column not in existing_indexes:
print("Creating index on {}.{}".format(table_name, fk.column))
table.create_index([fk.column])
db.index_foreign_keys()
@cli.command(name="create-index")

View file

@ -315,6 +315,16 @@ class Database:
# can see the newly created foreign key.
self.vacuum()
def index_foreign_keys(self):
for table_name in self.table_names():
table = self[table_name]
existing_indexes = {
i.columns[0] for i in table.indexes if len(i.columns) == 1
}
for fk in table.foreign_keys:
if fk.column not in existing_indexes:
table.create_index([fk.column])
def vacuum(self):
self.conn.execute("VACUUM;")

View file

@ -361,6 +361,16 @@ def test_add_foreign_key_guess_table(fresh_db):
)
def test_index_foreign_keys(fresh_db):
test_add_foreign_key_guess_table(fresh_db)
assert [] == fresh_db["dogs"].indexes
fresh_db.index_foreign_keys()
assert [["breed_id"]] == [i.columns for i in fresh_db["dogs"].indexes]
# Calling it a second time should do nothing
fresh_db.index_foreign_keys()
assert [["breed_id"]] == [i.columns for i in fresh_db["dogs"].indexes]
@pytest.mark.parametrize(
"extra_data,expected_new_columns",
[