@@ -88,16 +88,23 @@ class Comparer:
8888
8989 Simply call the `compare` method to get the result.
9090
91+ You can pass a flag, `dispose_engines`, to the constructor to dispose the engines after
92+ the comparison is complete. If you use the `from_params` classmethod, the engines will
93+ automatically be disposed after the comparison is complete.
94+
9195 You can customise how certain aspects of the comparison are performed by setting your own
9296 classes for the `ignore_spec_factory` and `compare_result_class` attributes.
9397 """
9498
9599 ignore_spec_factory_class = IgnoreSpecFactory
96100 compare_result_class = CompareResult
97101
98- def __init__ (self , db_one_engine : Engine , db_two_engine : Engine ):
102+ def __init__ (
103+ self , db_one_engine : Engine , db_two_engine : Engine , * , dispose_engines : bool = False
104+ ):
99105 self .db_one_engine = db_one_engine
100106 self .db_two_engine = db_two_engine
107+ self .__dispose_engines = dispose_engines
101108
102109 @classmethod
103110 def from_params (
@@ -112,7 +119,7 @@ def from_params(
112119 db_one_engine = DBConnectionFactory .create_engine (db_one_uri , ** db_one_params )
113120 db_two_engine = DBConnectionFactory .create_engine (db_two_uri , ** db_two_params )
114121
115- return cls (db_one_engine , db_two_engine )
122+ return cls (db_one_engine , db_two_engine , dispose_engines = True )
116123
117124 def compare (
118125 self ,
@@ -125,18 +132,23 @@ def compare(
125132
126133 filtered_inspectors = self ._filter_inspectors (set (ignore_inspectors or set ()))
127134
128- result = {}
129- with self .db_one_engine .begin (), self .db_two_engine .begin ():
130- for key , inspector_class in filtered_inspectors :
131- inspector = inspector_class (one_alias = one_alias , two_alias = two_alias )
135+ try :
136+ result = {}
137+ with self .db_one_engine .begin (), self .db_two_engine .begin ():
138+ for key , inspector_class in filtered_inspectors :
139+ inspector = inspector_class (one_alias = one_alias , two_alias = two_alias )
132140
133- db_one_info = self ._get_db_info (ignore_specs , inspector , self .db_one_engine )
134- db_two_info = self ._get_db_info (ignore_specs , inspector , self .db_two_engine )
141+ db_one_info = self ._get_db_info (ignore_specs , inspector , self .db_one_engine )
142+ db_two_info = self ._get_db_info (ignore_specs , inspector , self .db_two_engine )
135143
136- if db_one_info is not None and db_two_info is not None :
137- result [key ] = inspector .diff (db_one_info , db_two_info )
144+ if db_one_info is not None and db_two_info is not None :
145+ result [key ] = inspector .diff (db_one_info , db_two_info )
138146
139- return self .compare_result_class (result , one_alias = one_alias , two_alias = two_alias )
147+ return self .compare_result_class (result , one_alias = one_alias , two_alias = two_alias )
148+
149+ finally :
150+ if self .__dispose_engines :
151+ self ._dispose_engines ()
140152
141153 def _filter_inspectors (
142154 self , ignore_inspectors : set [str ] | None
@@ -157,3 +169,8 @@ def _get_db_info(
157169 return inspector .inspect (engine , ignore_specs )
158170 except InspectorNotSupported as e :
159171 logger .warning ({"engine" : engine , "inspector" : inspector .key , "error" : e .message })
172+
173+ def _dispose_engines (self ) -> None :
174+ """Dispose engines to close any pooled connections."""
175+ self .db_one_engine .dispose ()
176+ self .db_two_engine .dispose ()
0 commit comments