async def _execute(self, query: str, *args) -> AsyncGenerator[Record, None]: query_type = self.query_type(query) if query_type == QueryTypes.FETCH: query += " FORMAT TSVWithNamesAndTypes" if args: if query_type != QueryTypes.INSERT: raise ChClientError( "It is possible to pass arguments only for INSERT queries" ) params = {**self.params, "query": query} if 'FORMAT JSONEachRow' in query: data = json2ch(*args) else: data = rows2ch(*args) else: params = self.params data = query.encode() async with self._session.post( self.url, params=params, data=data ) as resp: # type: client.ClientResponse if resp.status != 200: raise ChClientError((await resp.read()).decode(errors='replace')) if query_type == QueryTypes.FETCH: rf = RecordsFabric( names=await resp.content.readline(), tps=await resp.content.readline(), ) async for line in resp.content: yield rf.new(line)
async def _execute( self, query: str, *args, json: bool = False, query_params: Optional[Dict[str, Any]] = None, query_id: str = None, ) -> AsyncGenerator[Record, None]: query_params = self._prepare_query_params(query_params) query = query.format(**query_params) need_fetch, is_json, statement_type = self._parse_squery(query) if not is_json and json: query += " FORMAT JSONEachRow" is_json = True if not is_json and need_fetch: query += " FORMAT TSVWithNamesAndTypes" if args: if statement_type != 'INSERT': raise ChClientError( "It is possible to pass arguments only for INSERT queries" ) params = {**self.params, "query": query} if is_json: data = json2ch(*args, dumps=self._json.dumps) else: data = rows2ch(*args) else: params = {**self.params} data = query.encode() if query_id is not None: params["query_id"] = query_id if need_fetch: response = self._http_client.post_return_lines( url=self.url, params=params, data=data ) if is_json: rf = FromJsonFabric(loads=self._json.loads) async for line in response: yield rf.new(line) else: rf = RecordsFabric( names=await response.__anext__(), tps=await response.__anext__(), ) async for line in response: yield rf.new(line) else: await self._http_client.post_no_return( url=self.url, params=params, data=data )
async def _execute( self, query: str, *args, json: bool = False, query_params: Optional[Dict[str, Any]] = None, ) -> AsyncGenerator[Record, None]: query_params = self._prepare_query_params(query_params) query = query.format(**query_params) need_fetch, is_json, statement_type = self._parse_squery(query) if not is_json and json: query += " FORMAT JSONEachRow" is_json = True if not is_json and need_fetch: query += " FORMAT TSVWithNamesAndTypes" if args: if statement_type != 'INSERT': raise ChClientError( "It is possible to pass arguments only for INSERT queries") params = {**self.params, "query": query} if is_json: data = json2ch(*args, dumps=self._json.dumps) else: data = rows2ch(*args) else: params = self.params data = query.encode() async with self._session.post( self.url, params=params, data=data) as resp: # type: client.ClientResponse if resp.status != 200: raise ChClientError((await resp.read()).decode(errors='replace')) if need_fetch: if is_json: rf = FromJsonFabric(loads=self._json.loads) async for line in resp.content: yield rf.new(line) else: rf = RecordsFabric( names=await resp.content.readline(), tps=await resp.content.readline(), ) async for line in resp.content: yield rf.new(line)