docs: def drop(self, ex):
      "helper for apply_sql in DropX case"
      # todo: factor out inheritance logic (for readability)
      if ex.name not in self:
        if ex.ifexists: return
        raise KeyError(ex.name)
      table_ = self[ex.name]
      parent = table_.parent_table
      if table_.child_tables:
        if not ex.cascade:
          raise table.IntegrityError('delete_parent_without_cascade',ex.name)
        self.cascade_delete(ex.name)
      else: del self[ex.name]
      if parent: parent.child_tables.remove(table_)