diff --git a/docs/python-api.rst b/docs/python-api.rst index 4d9ba7e..374bdc6 100644 --- a/docs/python-api.rst +++ b/docs/python-api.rst @@ -382,6 +382,20 @@ You can cause any missing columns to be added automatically using ``alter=True`` >>> db["dogs"].update(1, {"breed": "Mutt"}, alter=True) +.. _python_api_delete: + +Deleting a specific record +========================== + +You can delete a record using ``table.delete()``:: + + >>> db = sqlite_utils.Database("dogs.db") + >>> db["dogs"].delete(1) + +The ``delete()`` method takes the primary key of the record. This can be a tuple of values if the row has a compound primary key:: + + >>> db["compound_dogs"].delete((5, 3)) + Upserting data ============== diff --git a/sqlite_utils/db.py b/sqlite_utils/db.py index e36e191..68a2002 100644 --- a/sqlite_utils/db.py +++ b/sqlite_utils/db.py @@ -853,6 +853,17 @@ class Table(Queryable): def value_or_default(self, key, value): return self._defaults[key] if value is DEFAULT else value + def delete(self, pk_values): + if not isinstance(pk_values, (list, tuple)): + pk_values = [pk_values] + self.get(pk_values) + wheres = ["[{}] = ?".format(pk_name) for pk_name in self.pks] + sql = "delete from [{table}] where {wheres}".format( + table=self.name, wheres=" and ".join(wheres) + ) + with self.db.conn: + self.db.conn.execute(sql, pk_values) + def update(self, pk_values, updates=None, alter=False): updates = updates or {} if not isinstance(pk_values, (list, tuple)): diff --git a/tests/test_delete.py b/tests/test_delete.py new file mode 100644 index 0000000..6758831 --- /dev/null +++ b/tests/test_delete.py @@ -0,0 +1,14 @@ +def test_delete_rowid_table(fresh_db): + table = fresh_db["table"] + table.insert({"foo": 1}).last_pk + rowid = table.insert({"foo": 2}).last_pk + table.delete(rowid) + assert [{"foo": 1}] == list(table.rows) + + +def test_delete_pk_table(fresh_db): + table = fresh_db["table"] + table.insert({"id": 1}, pk="id") + table.insert({"id": 2}, pk="id") + table.delete(1) + assert [{"id": 2}] == list(table.rows)