55
66from contextlib import contextmanager
77from datetime import date , datetime , time
8+ from distutils .version import LooseVersion
89from functools import partial
910import re
1011from typing import Iterator , List , Optional , Union , overload
@@ -55,6 +56,16 @@ def _is_sqlalchemy_connectable(con):
5556 return False
5657
5758
59+ def _gt14 () -> bool :
60+ """
61+ Check if sqlalchemy.__version__ is at least 1.4.0, when several
62+ deprecations were made.
63+ """
64+ import sqlalchemy
65+
66+ return LooseVersion (sqlalchemy .__version__ ) >= LooseVersion ("1.4.0" )
67+
68+
5869def _convert_params (sql , params ):
5970 """Convert SQL and params args to DBAPI2.0 compliant format."""
6071 args = [sql ]
@@ -715,7 +726,10 @@ def sql_schema(self):
715726
716727 def _execute_create (self ):
717728 # Inserting table into database, add to MetaData object
718- self .table = self .table .tometadata (self .pd_sql .meta )
729+ if _gt14 ():
730+ self .table = self .table .to_metadata (self .pd_sql .meta )
731+ else :
732+ self .table = self .table .tometadata (self .pd_sql .meta )
719733 self .table .create ()
720734
721735 def create (self ):
@@ -1409,9 +1423,17 @@ def to_sql(
14091423 # Only check when name is not a number and name is not lower case
14101424 engine = self .connectable .engine
14111425 with self .connectable .connect () as conn :
1412- table_names = engine .table_names (
1413- schema = schema or self .meta .schema , connection = conn
1414- )
1426+ if _gt14 ():
1427+ from sqlalchemy import inspect
1428+
1429+ insp = inspect (conn )
1430+ table_names = insp .get_table_names (
1431+ schema = schema or self .meta .schema
1432+ )
1433+ else :
1434+ table_names = engine .table_names (
1435+ schema = schema or self .meta .schema , connection = conn
1436+ )
14151437 if name not in table_names :
14161438 msg = (
14171439 f"The provided table name '{ name } ' is not found exactly as "
@@ -1426,9 +1448,15 @@ def tables(self):
14261448 return self .meta .tables
14271449
14281450 def has_table (self , name , schema = None ):
1429- return self .connectable .run_callable (
1430- self .connectable .dialect .has_table , name , schema or self .meta .schema
1431- )
1451+ if _gt14 ():
1452+ import sqlalchemy as sa
1453+
1454+ insp = sa .inspect (self .connectable )
1455+ return insp .has_table (name , schema or self .meta .schema )
1456+ else :
1457+ return self .connectable .run_callable (
1458+ self .connectable .dialect .has_table , name , schema or self .meta .schema
1459+ )
14321460
14331461 def get_table (self , table_name , schema = None ):
14341462 schema = schema or self .meta .schema
0 commit comments