Added table.delete(pk) method, refs #62

This commit is contained in:
Simon Willison 2019-11-04 08:07:44 -08:00
commit 19073d6d97
3 changed files with 39 additions and 0 deletions

View file

@ -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
==============

View file

@ -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)):

14
tests/test_delete.py Normal file
View file

@ -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)