我写了一个雪花和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___
功能中,我显然已经关闭了连接并配置了引擎。另外,我编写的析构函数执行相同的工作以关闭连接并配置引擎。为什么线程仍然在那里?当我正确处置了我创建的引擎时,为什么程序没有终止?
先谢谢您。