Соединение Snowflake & Sqlalchemy закрыто, но поток все еще зависает - PullRequest
0 голосов
/ 21 февраля 2020

Я написал оболочку снежинки и 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___ я четко закрыл соединение и утилизировал двигатель. Кроме того, деструктор, который я написал, выполняет ту же работу, чтобы закрыть соединение и утилизировать двигатель. Почему нить все еще там? Почему программа не завершает работу, поскольку я правильно настроил созданный мной движок?

Заранее спасибо.

...