From 3f330df20fa6e0bd4390ed133ef65eeba0fb17f3 Mon Sep 17 00:00:00 2001 From: Stefan Wehrmeyer Date: Tue, 16 May 2017 16:57:07 +0200 Subject: [PATCH] Check for clauses and filters in delete Guard against wrong API use before dropping all data --- dataset/persistence/table.py | 2 +- test/test_persistence.py | 8 +++++++- 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/dataset/persistence/table.py b/dataset/persistence/table.py index a126288..6283890 100644 --- a/dataset/persistence/table.py +++ b/dataset/persistence/table.py @@ -249,7 +249,7 @@ class Table(object): If no arguments are given, all records are deleted. """ self._check_dropped() - if _filter: + if _filter or _clauses: q = self._args_to_clause(_filter, clauses=_clauses) stmt = self.table.delete(q) else: diff --git a/test/test_persistence.py b/test/test_persistence.py index 70924a7..2b7bfb3 100644 --- a/test/test_persistence.py +++ b/test/test_persistence.py @@ -7,7 +7,7 @@ try: except ImportError: # pragma: no cover from ordereddict import OrderedDict # Python < 2.7 drop-in -from sqlalchemy.exc import IntegrityError, SQLAlchemyError +from sqlalchemy.exc import IntegrityError, SQLAlchemyError, ArgumentError from dataset import connect from dataset.util import DatasetException @@ -251,7 +251,13 @@ class TableTestCase(unittest.TestCase): 'temperature': -10, 'place': 'Berlin'} ) + original_count = len(self.tbl) assert len(self.tbl) == len(TEST_DATA) + 1, len(self.tbl) + # Test bad use of API + with self.assertRaises(ArgumentError): + self.tbl.delete({'place': 'Berlin'}) is True, 'should return 1' + assert len(self.tbl) == original_count, len(self.tbl) + assert self.tbl.delete(place='Berlin') is True, 'should return 1' assert len(self.tbl) == len(TEST_DATA), len(self.tbl) assert self.tbl.delete() is True, 'should return non zero'