delete_where(analyze=True), closes #378

This commit is contained in:
Simon Willison 2022-01-10 17:08:05 -08:00
commit 389cbd5792
3 changed files with 31 additions and 2 deletions

View file

@ -717,6 +717,8 @@ You can delete all records in a table that match a specific WHERE statement usin
Calling ``table.delete_where()`` with no other arguments will delete every row in the table.
Pass ``analyze=True`` to run ``ANALYZE`` against the table after deleting the rows.
.. _python_api_upsert:
Upserting data

View file

@ -2119,15 +2119,28 @@ class Table(Queryable):
return self
def delete_where(
self, where: str = None, where_args: Optional[Union[Iterable, dict]] = None
self,
where: str = None,
where_args: Optional[Union[Iterable, dict]] = None,
analyze: bool = False,
) -> "Table":
"Delete rows matching specified where clause, or delete all rows in the table."
"""
Delete rows matching the specified where clause, or delete all rows in the table.
- ``where`` - a SQL fragment to use as a ``WHERE`` clause, for example ``age > ?`` or ``age > :age``.
- ``where_args`` - a list of arguments (if using ``?``) or a dictionary (if using ``:age``).
- ``analyze`` - set to ``True`` to run ``ANALYZE`` after the rows have been deleted.
See :ref:`python_api_delete_where`.
"""
if not self.exists():
return self
sql = "delete from [{}]".format(self.name)
if where is not None:
sql += " where " + where
self.db.execute(sql, where_args or [])
if analyze:
self.analyze()
return self
def update(

View file

@ -30,3 +30,17 @@ def test_delete_where_all(fresh_db):
assert 10 == table.count
table.delete_where()
assert 0 == table.count
def test_delete_where_analyze(fresh_db):
table = fresh_db["table"]
table.insert_all(({"id": i, "i": i} for i in range(10)), pk="id")
table.create_index(["i"], analyze=True)
assert "sqlite_stat1" in fresh_db.table_names()
assert list(fresh_db["sqlite_stat1"].rows) == [
{"tbl": "table", "idx": "idx_table_i", "stat": "10 1"}
]
table.delete_where("id > ?", [5], analyze=True)
assert list(fresh_db["sqlite_stat1"].rows) == [
{"tbl": "table", "idx": "idx_table_i", "stat": "6 1"}
]