Skip to content

Commit 9b57945

Browse files
authored
fix(duckdbConnection): make duckdb connection manager non singleton (#1710)
* fix(duckdbConnection): shared connection space between duckdb * fix(dataset): add test case
1 parent 455dfdb commit 9b57945

File tree

2 files changed

+24
-19
lines changed

2 files changed

+24
-19
lines changed
Lines changed: 15 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,3 @@
1-
import weakref
21
from typing import Optional
32

43
import duckdb
@@ -7,37 +6,34 @@
76

87

98
class DuckDBConnectionManager:
10-
_instance = None
11-
12-
def __new__(cls):
13-
if cls._instance is None:
14-
cls._instance = super(DuckDBConnectionManager, cls).__new__(cls)
15-
cls._instance._init_connection()
16-
weakref.finalize(cls._instance, cls._close_connection)
17-
return cls._instance
18-
19-
def _init_connection(self):
9+
def __init__(self):
2010
"""Initialize a DuckDB connection."""
2111
self.connection = duckdb.connect()
2212
self._registered_tables = set()
2313

24-
@classmethod
25-
def _close_connection(cls):
26-
"""Closes the DuckDB connection when the instance is deleted."""
27-
if cls._instance and hasattr(cls._instance, "connection"):
28-
cls._instance.connection.close()
29-
cls._instance = None
14+
def __del__(self):
15+
"""Destructor to ensure the DuckDB connection is closed."""
16+
self.close()
3017

3118
def register(self, name: str, df):
3219
"""Registers a DataFrame as a DuckDB table."""
3320
self.connection.register(name, df)
3421
self._registered_tables.add(name)
3522

23+
def unregister(self, name: str):
24+
"""Unregister a previously registered DuckDB table."""
25+
if name in self._registered_tables:
26+
self.connection.unregister(name)
27+
self._registered_tables.remove(name)
28+
3629
def sql(self, query: str, params: Optional[list] = None):
3730
"""Executes an SQL query and returns the result as a Pandas DataFrame."""
3831
query = SQLParser.transpile_sql_dialect(query, to_dialect="duckdb")
3932
return self.connection.sql(query, params=params)
4033

4134
def close(self):
42-
"""Manually close the connection if needed."""
43-
self._close_connection()
35+
"""Closes the DuckDB connection."""
36+
if hasattr(self, "connection") and self.connection:
37+
self.connection.close()
38+
self.connection = None
39+
self._registered_tables.clear()

tests/unit_tests/data_loader/test_duckdbmanager.py

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,3 +10,12 @@ def duck_db_manager(self):
1010

1111
def test_connection_correct_closing_doesnt_throw(self, duck_db_manager):
1212
duck_db_manager.close()
13+
14+
def test_unregister(self, duck_db_manager, sample_df):
15+
duck_db_manager.register("test", sample_df)
16+
17+
assert "test" in duck_db_manager._registered_tables
18+
19+
duck_db_manager.unregister("test")
20+
21+
assert len(duck_db_manager._registered_tables) == 0

0 commit comments

Comments
 (0)