@@ -87,12 +87,15 @@ def __init__(
8787 if ydb_session_pool is not None :
8888 self ._shared_session_pool = True
8989 self ._session_pool = ydb_session_pool
90+ settings = self ._get_client_settings ()
91+ self ._session_pool ._query_client_settings = settings
9092 self ._driver = self ._session_pool ._driver
9193 else :
9294 driver_config = ydb .DriverConfig (
9395 endpoint = self .endpoint ,
9496 database = self .database ,
9597 credentials = self .credentials ,
98+ query_client_settings = self ._get_client_settings (),
9699 )
97100 self ._driver = self ._driver_cls (driver_config )
98101 self ._session_pool = self ._pool_cls (self ._driver , size = 5 )
@@ -126,11 +129,15 @@ def get_isolation_level(self) -> str:
126129 msg = f"{ self ._tx_mode .name } is not supported"
127130 raise NotSupportedError (msg )
128131
129- def _maybe_init_tx (
130- self , session : ydb .QuerySession | ydb .aio .QuerySession
131- ) -> None :
132- if self ._tx_context is None and self .interactive_transaction :
133- self ._tx_context = session .transaction (self ._tx_mode )
132+ def _get_client_settings (self ) -> ydb .QueryClientSettings :
133+ return (
134+ ydb .QueryClientSettings ()
135+ .with_native_date_in_result_sets (True )
136+ .with_native_datetime_in_result_sets (True )
137+ .with_native_timestamp_in_result_sets (True )
138+ .with_native_interval_in_result_sets (True )
139+ .with_native_json_in_result_sets (False )
140+ )
134141
135142
136143class Connection (BaseConnection ):
@@ -160,17 +167,11 @@ def __init__(
160167 self ._current_cursor : Cursor | None = None
161168
162169 def cursor (self ) -> Cursor :
163- if self ._session is None :
164- raise RuntimeError ("Connection is not ready, use wait_ready." )
165-
166- self ._maybe_init_tx (self ._session )
167-
168- self ._current_cursor = self ._cursor_cls (
169- session = self ._session ,
170+ return self ._cursor_cls (
171+ session_pool = self ._session_pool ,
170172 tx_mode = self ._tx_mode ,
171173 tx_context = self ._tx_context ,
172174 )
173- return self ._current_cursor
174175
175176 def wait_ready (self , timeout : int = 10 ) -> None :
176177 try :
@@ -185,27 +186,33 @@ def wait_ready(self, timeout: int = 10) -> None:
185186 )
186187 raise InterfaceError (msg ) from e
187188
188- self ._session = self ._session_pool .acquire ()
189+ @handle_ydb_errors
190+ def begin (self ) -> None :
191+ self ._tx_context = None
192+ if self .interactive_transaction :
193+ self ._session = self ._session_pool .acquire ()
194+ self ._tx_context = self ._session .transaction (self ._tx_mode )
189195
190196 @handle_ydb_errors
191197 def commit (self ) -> None :
192198 if self ._tx_context and self ._tx_context .tx_id :
193199 self ._tx_context .commit ()
200+ self ._session_pool .release (self ._session )
194201 self ._tx_context = None
202+ self ._session = None
195203
196204 @handle_ydb_errors
197205 def rollback (self ) -> None :
198206 if self ._tx_context and self ._tx_context .tx_id :
199207 self ._tx_context .rollback ()
208+ self ._session_pool .release (self ._session )
200209 self ._tx_context = None
210+ self ._session = None
201211
202212 @handle_ydb_errors
203213 def close (self ) -> None :
204214 self .rollback ()
205215
206- if self ._current_cursor :
207- self ._current_cursor .close ()
208-
209216 if self ._session :
210217 self ._session_pool .release (self ._session )
211218
@@ -287,17 +294,11 @@ def __init__(
287294 self ._current_cursor : AsyncCursor | None = None
288295
289296 def cursor (self ) -> AsyncCursor :
290- if self ._session is None :
291- raise RuntimeError ("Connection is not ready, use wait_ready." )
292-
293- self ._maybe_init_tx (self ._session )
294-
295- self ._current_cursor = self ._cursor_cls (
296- session = self ._session ,
297+ return self ._cursor_cls (
298+ session_pool = self ._session_pool ,
297299 tx_mode = self ._tx_mode ,
298300 tx_context = self ._tx_context ,
299301 )
300- return self ._current_cursor
301302
302303 async def wait_ready (self , timeout : int = 10 ) -> None :
303304 try :
@@ -312,27 +313,33 @@ async def wait_ready(self, timeout: int = 10) -> None:
312313 )
313314 raise InterfaceError (msg ) from e
314315
315- self ._session = await self ._session_pool .acquire ()
316+ @handle_ydb_errors
317+ async def begin (self ) -> None :
318+ self ._tx_context = None
319+ if self .interactive_transaction :
320+ self ._session = await self ._session_pool .acquire ()
321+ self ._tx_context = self ._session .transaction (self ._tx_mode )
316322
317323 @handle_ydb_errors
318324 async def commit (self ) -> None :
319- if self ._tx_context and self ._tx_context .tx_id :
325+ if self ._session and self . _tx_context and self ._tx_context .tx_id :
320326 await self ._tx_context .commit ()
327+ await self ._session_pool .release (self ._session )
328+ self ._session = None
321329 self ._tx_context = None
322330
323331 @handle_ydb_errors
324332 async def rollback (self ) -> None :
325- if self ._tx_context and self ._tx_context .tx_id :
333+ if self ._session and self . _tx_context and self ._tx_context .tx_id :
326334 await self ._tx_context .rollback ()
335+ await self ._session_pool .release (self ._session )
336+ self ._session = None
327337 self ._tx_context = None
328338
329339 @handle_ydb_errors
330340 async def close (self ) -> None :
331341 await self .rollback ()
332342
333- if self ._current_cursor :
334- await self ._current_cursor .close ()
335-
336343 if self ._session :
337344 await self ._session_pool .release (self ._session )
338345
0 commit comments