Skip to content

Commit c25f507

Browse files
committed
feat: Allow setting of columnar and using numpy
1 parent fa6190a commit c25f507

File tree

1 file changed

+45
-0
lines changed

1 file changed

+45
-0
lines changed

clickhouse_backend/driver/connection.py

Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
from clickhouse_driver import connection
44
from clickhouse_driver.dbapi import connection as dbapi_connection
55
from clickhouse_driver.dbapi import cursor, errors
6+
from clickhouse_driver.result import IterQueryResult, ProgressQueryResult, QueryResult
67
from django.conf import settings
78

89
from .escape import escape_params
@@ -70,6 +71,11 @@ def send_query(self, query, query_id=None, params=None):
7071

7172

7273
class Cursor(cursor.Cursor):
74+
# Whether to return data in columnar format. For backwards-compatibility,
75+
# let's default to None.
76+
columnar = None
77+
_use_numpy = None
78+
7379
def close(self):
7480
"""Push client back to connection pool"""
7581
if self.closed:
@@ -81,12 +87,51 @@ def close(self):
8187
def closed(self):
8288
return self._state == self._states.CURSOR_CLOSED
8389

90+
@property
91+
def use_numpy(self):
92+
if self._use_numpy is None:
93+
return self._client.client_settings["use_numpy"]
94+
return self._use_numpy
95+
96+
@use_numpy.setter
97+
def use_numpy(self, value):
98+
self._use_numpy = value
99+
self._client.client_settings["use_numpy"] = value
100+
if value:
101+
try:
102+
from clickhouse_driver.numpy.result import (
103+
NumpyIterQueryResult,
104+
NumpyProgressQueryResult,
105+
NumpyQueryResult,
106+
)
107+
self._client.query_result_cls = NumpyQueryResult
108+
self._client.iter_query_result_cls = NumpyIterQueryResult
109+
self._client.progress_query_result_cls = NumpyProgressQueryResult
110+
except ImportError as e:
111+
raise RuntimeError('Extras for NumPy must be installed') from e
112+
else:
113+
self._client.query_result_cls = QueryResult
114+
self._client.iter_query_result_cls = IterQueryResult
115+
self._client.progress_query_result_cls = ProgressQueryResult
116+
84117
def __del__(self):
85118
# If someone forgets calling close method,
86119
# then release connection when gc happens.
87120
if not self.closed:
88121
self.close()
89122

123+
124+
125+
def _prepare(self):
126+
"""Override clickhouse_driver.Cursor._prepare() to add columnar kwargs.
127+
128+
See https://github.com/jayvynl/django-clickhouse-backend/issues/119
129+
"""
130+
execute, execute_kwargs = super()._prepare()
131+
if self.columnar is not None:
132+
execute_kwargs["columnar"] = self.columnar
133+
return execute, execute_kwargs
134+
90135
def execute(self, operation, parameters=None):
91136
"""fix https://github.com/jayvynl/django-clickhouse-backend/issues/9"""
92137
if getattr(

0 commit comments

Comments
 (0)