I think this will end up being way too many abstract methods.  I have learned the hard-way:  It's easy for subclasses to add their own specializations, but it is a pain when an abstract method does not apply for a subclass.  However, we do have a runtime-fixed number of categories (i.e. columns) and data (i.e. rows).  What about abstracting just the high-level stuff, like:

``get_columns()``   #  e.g. ``return ('image', 'tag', 'short_id', 'long_id', 'size', ...)``
``search(column, data)``    # e.g. ``return [<rows where row.column == data>]``

Based on the names you have here, nearly all would fit into just those two operations.  Then subclasses have much more freedom to expand into specialized operations.   This also makes unittesting much easier to do.