From 971b9e62df7b4101f48521fc579530916cd7766d Mon Sep 17 00:00:00 2001
From: Mike Bayer <mike_mp@zzzcomputing.com>
Date: Tue, 16 Jul 2019 09:39:49 -0400
Subject: [PATCH] Use engine.connect(); don't use private _run_visitor method

SQLAlchemy 1.3 has deprecated engine.contextual_connect() which
will be removed in 1.4.   Additionally, private methods like
Engine._run_visitor will also be removed.

Change-Id: I319785d7dd83ffe2c6e651a2494b073becc84684
---
 migrate/changeset/databases/visitor.py |  2 +-
 migrate/changeset/schema.py            | 22 ++++++++++++++++++----
 2 files changed, 19 insertions(+), 5 deletions(-)

diff --git a/migrate/changeset/databases/visitor.py b/migrate/changeset/databases/visitor.py
index c70aa6b..7eb2301 100644
--- a/migrate/changeset/databases/visitor.py
+++ b/migrate/changeset/databases/visitor.py
@@ -73,7 +73,7 @@ def run_single_visitor(engine, visitorcallable, element,
     with support for migrate visitors.
     """
     if connection is None:
-        conn = engine.contextual_connect(close_with_result=False)
+        conn = engine.connect()
     else:
         conn = connection
     visitor = visitorcallable(engine.dialect, conn)
diff --git a/migrate/changeset/schema.py b/migrate/changeset/schema.py
index a33be4b..35f9d7a 100644
--- a/migrate/changeset/schema.py
+++ b/migrate/changeset/schema.py
@@ -138,7 +138,7 @@ def alter_column(*p, **k):
     delta = ColumnDelta(*p, **k)
 
     visitorcallable = get_engine_visitor(engine, 'schemachanger')
-    engine._run_visitor(visitorcallable, delta)
+    _run_visitor(engine, visitorcallable, delta)
 
     return delta
 
@@ -167,6 +167,20 @@ def _to_index(index, table=None, engine=None):
     return ret
 
 
+def _run_visitor(
+    connectable, visitorcallable, element, connection=None, **kwargs
+):
+    if connection is not None:
+        visitorcallable(
+            connection.dialect, connection, **kwargs).traverse_single(element)
+    else:
+        conn = connectable.connect()
+        try:
+            visitorcallable(
+                conn.dialect, conn, **kwargs).traverse_single(element)
+        finally:
+            conn.close()
+
 
 # Python3: if we just use:
 #
@@ -574,7 +588,7 @@ populated with defaults
         self.add_to_table(table)
         engine = self.table.bind
         visitorcallable = get_engine_visitor(engine, 'columngenerator')
-        engine._run_visitor(visitorcallable, self, connection, **kwargs)
+        _run_visitor(engine, visitorcallable, self, connection, **kwargs)
 
         # TODO: reuse existing connection
         if self.populate_default and self.default is not None:
@@ -595,7 +609,7 @@ populated with defaults
             self.table = table
         engine = self.table.bind
         visitorcallable = get_engine_visitor(engine, 'columndropper')
-        engine._run_visitor(visitorcallable, self, connection, **kwargs)
+        _run_visitor(engine, visitorcallable, self, connection, **kwargs)
         self.remove_from_table(self.table, unset_table=False)
         self.table = None
         return self
@@ -689,7 +703,7 @@ class ChangesetIndex(object):
         engine = self.table.bind
         self.new_name = name
         visitorcallable = get_engine_visitor(engine, 'schemachanger')
-        engine._run_visitor(visitorcallable, self, connection, **kwargs)
+        _run_visitor(engine, visitorcallable, self, connection, **kwargs)
         self.name = name