diff options
Diffstat (limited to 'lib')
| -rw-r--r-- | lib/sqlalchemy/dialects/mysql/base.py | 9 | ||||
| -rw-r--r-- | lib/sqlalchemy/exc.py | 8 | ||||
| -rw-r--r-- | lib/sqlalchemy/sql/schema.py | 5 | ||||
| -rw-r--r-- | lib/sqlalchemy/testing/assertions.py | 15 |
4 files changed, 30 insertions, 7 deletions
diff --git a/lib/sqlalchemy/dialects/mysql/base.py b/lib/sqlalchemy/dialects/mysql/base.py index 21d325d0c..277ae5815 100644 --- a/lib/sqlalchemy/dialects/mysql/base.py +++ b/lib/sqlalchemy/dialects/mysql/base.py @@ -2052,8 +2052,14 @@ class MySQLDialect(default.DefaultDialect): rp = connection.execution_options( skip_user_error_events=True).execute(st) except exc.DBAPIError as e: - if self._extract_error_code(e.orig) == 1146: + code = self._extract_error_code(e.orig) + if code == 1146: raise exc.NoSuchTableError(full_name) + elif code == 1356: + raise exc.UnreflectableTableError( + "Table or view named %s could not be " + "reflected: %s" % (full_name, e) + ) else: raise rows = self._compat_fetchall(rp, charset=charset) @@ -2063,7 +2069,6 @@ class MySQLDialect(default.DefaultDialect): return rows - class _DecodingRowProxy(object): """Return unicode-decoded values based on type inspection. diff --git a/lib/sqlalchemy/exc.py b/lib/sqlalchemy/exc.py index e8ba34ba4..3db3c1085 100644 --- a/lib/sqlalchemy/exc.py +++ b/lib/sqlalchemy/exc.py @@ -199,6 +199,14 @@ class NoSuchTableError(InvalidRequestError): """Table does not exist or is not visible to a connection.""" +class UnreflectableTableError(InvalidRequestError): + """Table exists but can't be reflectted for some reason. + + .. versionadded:: 1.2 + + """ + + class UnboundExecutionError(InvalidRequestError): """SQL was attempted without a database connection to execute it on.""" diff --git a/lib/sqlalchemy/sql/schema.py b/lib/sqlalchemy/sql/schema.py index 1cdc7b425..a9aee5883 100644 --- a/lib/sqlalchemy/sql/schema.py +++ b/lib/sqlalchemy/sql/schema.py @@ -3903,7 +3903,10 @@ class MetaData(SchemaItem): name not in current] for name in load: - Table(name, self, **reflect_opts) + try: + Table(name, self, **reflect_opts) + except exc.UnreflectableTableError as uerr: + util.warn("Skipping table %s: %s" % (name, uerr)) def append_ddl_listener(self, event_name, listener): """Append a DDL event listener to this ``MetaData``. diff --git a/lib/sqlalchemy/testing/assertions.py b/lib/sqlalchemy/testing/assertions.py index 884556345..dfea33dc7 100644 --- a/lib/sqlalchemy/testing/assertions.py +++ b/lib/sqlalchemy/testing/assertions.py @@ -130,9 +130,16 @@ def _expect_warnings(exc_cls, messages, regex=True, assert_=True, real_warn = warnings.warn - def our_warn(msg, exception, *arg, **kw): - if not issubclass(exception, exc_cls): - return real_warn(msg, exception, *arg, **kw) + def our_warn(msg, *arg, **kw): + if isinstance(msg, exc_cls): + exception = msg + msg = str(exception) + elif arg: + exception = arg[0] + else: + exception = None + if not exception or not issubclass(exception, exc_cls): + return real_warn(msg, *arg, **kw) if not filters: return @@ -143,7 +150,7 @@ def _expect_warnings(exc_cls, messages, regex=True, assert_=True, seen.discard(filter_) break else: - real_warn(msg, exception, *arg, **kw) + real_warn(msg, *arg, **kw) with mock.patch("warnings.warn", our_warn): yield |
