summaryrefslogtreecommitdiff
path: root/lib/sqlalchemy/engine/reflection.py
diff options
context:
space:
mode:
authorMike Bayer <mike_mp@zzzcomputing.com>2023-01-04 23:32:23 -0500
committerMike Bayer <mike_mp@zzzcomputing.com>2023-01-05 09:38:04 -0500
commit7505cc5db44f2d3a84827519d3a7d926a9cdec23 (patch)
treefb6a2478da983981036c779d698d72d1cd23d7f5 /lib/sqlalchemy/engine/reflection.py
parent1e7d45283645c57556b7aecbc3a370a92de409ce (diff)
downloadsqlalchemy-7505cc5db44f2d3a84827519d3a7d926a9cdec23.tar.gz
revert MySQL to use DESCRIBE for has_table()
Restored the behavior of :meth:`.Inspector.has_table` to report on temporary tables for MySQL / MariaDB. This is currently the behavior for all other included dialects, but was removed for MySQL in 1.4 due to no longer using the DESCRIBE command; there was no documented support for temp tables being reported by the :meth:`.Inspector.has_table` method in this version or on any previous version, so the previous behavior was undefined. As SQLAlchemy 2.0 has added formal support for temp table status via :meth:`.Inspector.has_table`, the MySQL /MariaDB dialect has been reverted to use the "DESCRIBE" statement as it did in the SQLAlchemy 1.3 series and previously, and test support is added to include MySQL / MariaDB for this behavior. The previous issues with ROLLBACK being emitted which 1.4 sought to improve upon don't apply in SQLAlchemy 2.0 due to simplifications in how :class:`.Connection` handles transactions. DESCRIBE is necessary as MariaDB in particular has no consistently available public information schema of any kind in order to report on temp tables other than DESCRIBE/SHOW COLUMNS, which rely on throwing an error in order to report no results. Fixes: #9058 Change-Id: Ic511bd5989ec17beb37b7cddd913732b626af0e6
Diffstat (limited to 'lib/sqlalchemy/engine/reflection.py')
-rw-r--r--lib/sqlalchemy/engine/reflection.py19
1 files changed, 13 insertions, 6 deletions
diff --git a/lib/sqlalchemy/engine/reflection.py b/lib/sqlalchemy/engine/reflection.py
index 7e1fca0e5..050f18f2f 100644
--- a/lib/sqlalchemy/engine/reflection.py
+++ b/lib/sqlalchemy/engine/reflection.py
@@ -401,7 +401,8 @@ class Inspector(inspection.Inspectable["Inspector"]):
def has_table(
self, table_name: str, schema: Optional[str] = None, **kw: Any
) -> bool:
- r"""Return True if the backend has a table or view of the given name.
+ r"""Return True if the backend has a table, view, or temporary
+ table of the given name.
:param table_name: name of the table to check
:param schema: schema name to query, if not the default schema.
@@ -412,11 +413,17 @@ class Inspector(inspection.Inspectable["Inspector"]):
.. versionadded:: 1.4 - the :meth:`.Inspector.has_table` method
replaces the :meth:`_engine.Engine.has_table` method.
- .. versionchanged:: 2.0:: The method checks also for any type of
- views (plain or materialized).
- In previous version this behaviour was dialect specific. New
- dialect suite tests were added to ensure all dialect conform with
- this behaviour.
+ .. versionchanged:: 2.0:: :meth:`.Inspector.has_table` now formally
+ supports checking for additional table-like objects:
+
+ * any type of views (plain or materialized)
+ * temporary tables of any kind
+
+ Previously, these two checks were not formally specified and
+ different dialects would vary in their behavior. The dialect
+ testing suite now includes tests for all of these object types
+ and should be supported by all SQLAlchemy-included dialects.
+ Support among third party dialects may be lagging, however.
"""
with self._operation_context() as conn: