Check for clauses and filters in delete

Guard against wrong API use before dropping all data
This commit is contained in:
Stefan Wehrmeyer 2017-05-16 16:57:07 +02:00
parent 5fd8b3ef3e
commit 3f330df20f
2 changed files with 8 additions and 2 deletions

View File

@ -249,7 +249,7 @@ class Table(object):
If no arguments are given, all records are deleted. If no arguments are given, all records are deleted.
""" """
self._check_dropped() self._check_dropped()
if _filter: if _filter or _clauses:
q = self._args_to_clause(_filter, clauses=_clauses) q = self._args_to_clause(_filter, clauses=_clauses)
stmt = self.table.delete(q) stmt = self.table.delete(q)
else: else:

View File

@ -7,7 +7,7 @@ try:
except ImportError: # pragma: no cover except ImportError: # pragma: no cover
from ordereddict import OrderedDict # Python < 2.7 drop-in 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 import connect
from dataset.util import DatasetException from dataset.util import DatasetException
@ -251,7 +251,13 @@ class TableTestCase(unittest.TestCase):
'temperature': -10, 'temperature': -10,
'place': 'Berlin'} 'place': 'Berlin'}
) )
original_count = len(self.tbl)
assert len(self.tbl) == len(TEST_DATA) + 1, 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 self.tbl.delete(place='Berlin') is True, 'should return 1'
assert len(self.tbl) == len(TEST_DATA), len(self.tbl) assert len(self.tbl) == len(TEST_DATA), len(self.tbl)
assert self.tbl.delete() is True, 'should return non zero' assert self.tbl.delete() is True, 'should return non zero'