def destroy(session, data, model_class=None, synchronize_session=False):
"""Delete bulk `data`.
The `data` argument can be any of the following:
- Single instance of `model_class`
- List of `model_class` instances
- Primary key value (single value or ``tuple`` of values for composite
keys)
- List of primary key values.
- Dict containing primary key(s) mapping
- List of dicts with primary key(s) mappings
If a non-`model_class` instances are passed in, then `model_class` is
required to know which table to delete from.
Args:
session (Session): SQLAlchemy session object.
data (mixed): Data to delete from database.
synchronize_session (bool|str): Argument passed to
``Query.delete``.
Returns:
int: Number of deleted records.
"""
if not isinstance(data, list):
data = [data]
valid_model_class = isinstance(model_class, DeclarativeMeta)
mapped_data = defaultdict(list)
for idx, item in enumerate(data):
item_class = type(item)
if not isinstance(item_class, DeclarativeMeta) and valid_model_class:
class_ = model_class
else:
class_ = item_class
if not isinstance(class_, DeclarativeMeta):
raise TypeError('Type of value given to destory() function is not '
'a valid SQLALchemy declarative class and/or '
'model class argument is not valid. '
'Item with index {0} and with value "{1}" is '
'an instance of "{2}" and model class is {3}.'
.format(idx, item, type(item), model_class))
mapped_data[class_].append(item)
delete_count = 0
with transaction(session):
for model_class, data in iteritems(mapped_data):
count = (session.query(model_class)
.filter(primary_key_filter(data, model_class))
.options(orm.lazyload('*'))
.delete(synchronize_session=synchronize_session))
delete_count += count
return delete_count
评论列表
文章目录