3
3
from clickhouse_driver import connection
4
4
from clickhouse_driver .dbapi import connection as dbapi_connection
5
5
from clickhouse_driver .dbapi import cursor , errors
6
+ from clickhouse_driver .result import IterQueryResult , ProgressQueryResult , QueryResult
6
7
from django .conf import settings
7
8
8
9
from .escape import escape_params
@@ -70,6 +71,11 @@ def send_query(self, query, query_id=None, params=None):
70
71
71
72
72
73
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
+
73
79
def close (self ):
74
80
"""Push client back to connection pool"""
75
81
if self .closed :
@@ -81,12 +87,51 @@ def close(self):
81
87
def closed (self ):
82
88
return self ._state == self ._states .CURSOR_CLOSED
83
89
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
+
84
117
def __del__ (self ):
85
118
# If someone forgets calling close method,
86
119
# then release connection when gc happens.
87
120
if not self .closed :
88
121
self .close ()
89
122
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
+
90
135
def execute (self , operation , parameters = None ):
91
136
"""fix https://github.com/jayvynl/django-clickhouse-backend/issues/9"""
92
137
if getattr (
0 commit comments