Я написал оболочку снежинки и sqlalchemy для настройки одноразового подключения к хранилищу данных снежинки, и можно использовать это подключение для выполнения нескольких запросов позже. Код выглядит следующим образом:
class SnowFlakeConnection:
def __init__(self):
self.engine = create_engine(URL("XXXXX"))
self.connection = self.engine.connect()
def get_df_from_query (self, query):
'''
Params: Runs the supplied query
Return: DataFrame that contains the query Results
'''
df = pd.DataFrame()
df = pd.read_sql(query, self.connection)
df.columns = [x.upper() for x in (df.columns)]
return df
def __enter__(self):
return self
def __exit__(self, exc_type, exc_value, tb):
self.connection.close()
self.engine.dispose()
def __del__(self):
self.connection.close()
self.engine.dispose()
Затем я написал простую программу, вызывающую этот модуль SnowFlakeConnection.
if __name__ == "__main__":
with SnowFlakeConnection() as snowflake_connection:
snowflake_connection = SnowFlakeConnection()
## Making a sample connection
query = 'SELECT * FROM DB'
df_res = snowflake_connection.get_df_from_query(query)
print (df_res)
Однако, пока я могу правильно запустить df_res
в в конце концов, моя основная функция никогда не заканчивается. Он просто висит там и не выходит. После некоторого расследования я обнаружил, что создал новый поток, вызвав self.engine.connect()
во время инициализации. Однако в функции __exit___
я четко закрыл соединение и утилизировал двигатель. Кроме того, деструктор, который я написал, выполняет ту же работу, чтобы закрыть соединение и утилизировать двигатель. Почему нить все еще там? Почему программа не завершает работу, поскольку я правильно настроил созданный мной движок?
Заранее спасибо.