diff --git a/django/core/management/commands/inspectdb.py b/django/core/management/commands/inspectdb.py
index e45f22c..f606b41 100644
--- a/django/core/management/commands/inspectdb.py
+++ b/django/core/management/commands/inspectdb.py
@@ -11,6 +11,9 @@ class Command(NoArgsCommand):
         make_option('--database', action='store', dest='database',
             default=DEFAULT_DB_ALIAS, help='Nominates a database to '
                 'introspect.  Defaults to using the "default" database.'),
+
+        make_option('--skip', action='store_true', dest='skip',
+            default=False, help='Skips tables that cannot be read instead of erroring out.'),
     )
 
     requires_model_validation = False
@@ -44,83 +47,92 @@ class Command(NoArgsCommand):
         for table_name in connection.introspection.get_table_list(cursor):
             yield 'class %s(models.Model):' % table2model(table_name)
             try:
-                relations = connection.introspection.get_relations(cursor, table_name)
-            except NotImplementedError:
-                relations = {}
-            try:
-                indexes = connection.introspection.get_indexes(cursor, table_name)
-            except NotImplementedError:
-                indexes = {}
-            for i, row in enumerate(connection.introspection.get_table_description(cursor, table_name)):
-                column_name = row[0]
-                att_name = column_name.lower()
-                comment_notes = [] # Holds Field notes, to be displayed in a Python comment.
-                extra_params = {}  # Holds Field parameters such as 'db_column'.
-
-                # If the column name can't be used verbatim as a Python
-                # attribute, set the "db_column" for this Field.
-                if ' ' in att_name or '-' in att_name or keyword.iskeyword(att_name) or column_name != att_name:
-                    extra_params['db_column'] = column_name
-
-                # Modify the field name to make it Python-compatible.
-                if ' ' in att_name:
-                    att_name = att_name.replace(' ', '_')
-                    comment_notes.append('Field renamed to remove spaces.')
-                if '-' in att_name:
-                    att_name = att_name.replace('-', '_')
-                    comment_notes.append('Field renamed to remove dashes.')
-                if keyword.iskeyword(att_name):
-                    att_name += '_field'
-                    comment_notes.append('Field renamed because it was a Python reserved word.')
-                if column_name != att_name:
-                    comment_notes.append('Field name made lowercase.')
-
-                if i in relations:
-                    rel_to = relations[i][1] == table_name and "'self'" or table2model(relations[i][1])
-                    field_type = 'ForeignKey(%s' % rel_to
-                    if att_name.endswith('_id'):
-                        att_name = att_name[:-3]
-                    else:
+                try:
+                    relations = connection.introspection.get_relations(cursor, table_name)
+                except NotImplementedError:
+                    relations = {}
+                try:
+                    indexes = connection.introspection.get_indexes(cursor, table_name)
+                except NotImplementedError:
+                    indexes = {}
+                for i, row in enumerate(connection.introspection.get_table_description(cursor, table_name)):
+                    column_name = row[0]
+                    att_name = column_name.lower()
+                    comment_notes = [] # Holds Field notes, to be displayed in a Python comment.
+                    extra_params = {}  # Holds Field parameters such as 'db_column'.
+
+                    # If the column name can't be used verbatim as a Python
+                    # attribute, set the "db_column" for this Field.
+                    if ' ' in att_name or '-' in att_name or keyword.iskeyword(att_name) or column_name != att_name:
                         extra_params['db_column'] = column_name
+
+                    # Modify the field name to make it Python-compatible.
+                    if ' ' in att_name:
+                        att_name = att_name.replace(' ', '_')
+                        comment_notes.append('Field renamed to remove spaces.')
+                    if '-' in att_name:
+                        att_name = att_name.replace('-', '_')
+                        comment_notes.append('Field renamed to remove dashes.')
+                    if keyword.iskeyword(att_name):
+                        att_name += '_field'
+                        comment_notes.append('Field renamed because it was a Python reserved word.')
+                    if column_name != att_name:
+                        comment_notes.append('Field name made lowercase.')
+
+                    if i in relations:
+                        rel_to = relations[i][1] == table_name and "'self'" or table2model(relations[i][1])
+                        field_type = 'ForeignKey(%s' % rel_to
+                        if att_name.endswith('_id'):
+                            att_name = att_name[:-3]
+                        else:
+                            extra_params['db_column'] = column_name
+                    else:
+                        # Calling `get_field_type` to get the field type string and any
+                        # additional paramters and notes.
+                        field_type, field_params, field_notes = self.get_field_type(connection, table_name, row)
+                        extra_params.update(field_params)
+                        comment_notes.extend(field_notes)
+
+                        # Add primary_key and unique, if necessary.
+                        if column_name in indexes:
+                            if indexes[column_name]['primary_key']:
+                                extra_params['primary_key'] = True
+                            elif indexes[column_name]['unique']:
+                                extra_params['unique'] = True
+
+                        field_type += '('
+
+                    # Don't output 'id = meta.AutoField(primary_key=True)', because
+                    # that's assumed if it doesn't exist.
+                    if att_name == 'id' and field_type == 'AutoField(' and extra_params == {'primary_key': True}:
+                        continue
+
+                    # Add 'null' and 'blank', if the 'null_ok' flag was present in the
+                    # table description.
+                    if row[6]: # If it's NULL...
+                        extra_params['blank'] = True
+                        if not field_type in ('TextField(', 'CharField('):
+                            extra_params['null'] = True
+
+                    field_desc = '%s = models.%s' % (att_name, field_type)
+                    if extra_params:
+                        if not field_desc.endswith('('):
+                            field_desc += ', '
+                        field_desc += ', '.join(['%s=%r' % (k, v) for k, v in extra_params.items()])
+                    field_desc += ')'
+                    if comment_notes:
+                        field_desc += ' # ' + ' '.join(comment_notes)
+                    yield '    %s' % field_desc
+                for meta_line in self.get_meta(table_name):
+                    yield meta_line
+
+            except:
+                if options.get('skip'):
+                    yield "    # Error reading this table"
+                    yield "    pass"
+                    yield
                 else:
-                    # Calling `get_field_type` to get the field type string and any
-                    # additional paramters and notes.
-                    field_type, field_params, field_notes = self.get_field_type(connection, table_name, row)
-                    extra_params.update(field_params)
-                    comment_notes.extend(field_notes)
-
-                    # Add primary_key and unique, if necessary.
-                    if column_name in indexes:
-                        if indexes[column_name]['primary_key']:
-                            extra_params['primary_key'] = True
-                        elif indexes[column_name]['unique']:
-                            extra_params['unique'] = True
-
-                    field_type += '('
-
-                # Don't output 'id = meta.AutoField(primary_key=True)', because
-                # that's assumed if it doesn't exist.
-                if att_name == 'id' and field_type == 'AutoField(' and extra_params == {'primary_key': True}:
-                    continue
-
-                # Add 'null' and 'blank', if the 'null_ok' flag was present in the
-                # table description.
-                if row[6]: # If it's NULL...
-                    extra_params['blank'] = True
-                    if not field_type in ('TextField(', 'CharField('):
-                        extra_params['null'] = True
-
-                field_desc = '%s = models.%s' % (att_name, field_type)
-                if extra_params:
-                    if not field_desc.endswith('('):
-                        field_desc += ', '
-                    field_desc += ', '.join(['%s=%r' % (k, v) for k, v in extra_params.items()])
-                field_desc += ')'
-                if comment_notes:
-                    field_desc += ' # ' + ' '.join(comment_notes)
-                yield '    %s' % field_desc
-            for meta_line in self.get_meta(table_name):
-                yield meta_line
+                    raise
 
     def get_field_type(self, connection, table_name, row):
         """
