def build_select_expression( self, limit: int = None, offset: int = None, order_bys: List = None, ) -> sqlalchemy.sql.select: """ Constructs the actual database query used in the QuerySet. If any of the params is not passed the QuerySet own value is used. :param limit: number to limit the query :type limit: int :param offset: number to offset by :type offset: int :param order_bys: list of order-by fields names :type order_bys: List :return: built sqlalchemy select expression :rtype: sqlalchemy.sql.selectable.Select """ qry = Query( model_cls=self.model, select_related=self._select_related, filter_clauses=self.filter_clauses, exclude_clauses=self.exclude_clauses, offset=offset or self.query_offset, limit_count=limit or self.limit_count, fields=self._columns, exclude_fields=self._exclude_columns, order_bys=order_bys or self.order_bys, limit_raw_sql=self.limit_sql_raw, ) exp = qry.build_select_expression() # print("\n", exp.compile(compile_kwargs={"literal_binds": True})) return exp
async def _run_prefetch_query( self, target_field: Type["BaseField"], fields: Union[Set[Any], Dict[Any, Any], None], exclude_fields: Union[Set[Any], Dict[Any, Any], None], filter_clauses: List, ) -> Tuple[str, List]: """ Actually runs the queries against the database and populates the raw response for given related model. Returns table prefix as it's later needed to eventually initialize the children models. :param target_field: ormar field with relation definition :type target_field: Type["BaseField"] :param fields: fields to include :type fields: Union[Set[Any], Dict[Any, Any], None] :param exclude_fields: fields to exclude :type exclude_fields: Union[Set[Any], Dict[Any, Any], None] :param filter_clauses: list of clauses, actually one clause with ids of relation :type filter_clauses: List[sqlalchemy.sql.elements.TextClause] :return: table prefix and raw rows from sql response :rtype: Tuple[str, List] """ target_model = target_field.to target_name = target_model.get_name() select_related = [] query_target = target_model table_prefix = "" if issubclass(target_field, ManyToManyField): query_target = target_field.through select_related = [target_name] table_prefix = target_field.to.Meta.alias_manager.resolve_relation_alias( from_model=query_target, relation_name=target_name) self.already_extracted.setdefault(target_name, {})["prefix"] = table_prefix qry = Query( model_cls=query_target, select_related=select_related, filter_clauses=filter_clauses, exclude_clauses=[], offset=None, limit_count=None, fields=fields, exclude_fields=exclude_fields, order_bys=None, limit_raw_sql=False, ) expr = qry.build_select_expression() # print(expr.compile(compile_kwargs={"literal_binds": True})) rows = await self.database.fetch_all(expr) self.already_extracted.setdefault(target_name, {}).update({"raw": rows}) return table_prefix, rows
def build_select_expression(self) -> sqlalchemy.sql.select: qry = Query( model_cls=self.model, select_related=self._select_related, filter_clauses=self.filter_clauses, exclude_clauses=self.exclude_clauses, offset=self.query_offset, limit_count=self.limit_count, fields=self._columns, exclude_fields=self._exclude_columns, order_bys=self.order_bys, ) exp = qry.build_select_expression() # print(exp.compile(compile_kwargs={"literal_binds": True})) return exp
async def _run_prefetch_query( self, target_field: Type["BaseField"], fields: Union[Set[Any], Dict[Any, Any], None], exclude_fields: Union[Set[Any], Dict[Any, Any], None], filter_clauses: List, ) -> Tuple[str, List]: target_model = target_field.to target_name = target_model.get_name() select_related = [] query_target = target_model table_prefix = "" if issubclass(target_field, ManyToManyField): query_target = target_field.through select_related = [target_name] table_prefix = target_field.to.Meta.alias_manager.resolve_relation_join_new( query_target, target_name ) self.already_extracted.setdefault(target_name, {})["prefix"] = table_prefix qry = Query( model_cls=query_target, select_related=select_related, filter_clauses=filter_clauses, exclude_clauses=[], offset=None, limit_count=None, fields=fields, exclude_fields=exclude_fields, order_bys=None, ) expr = qry.build_select_expression() # print(expr.compile(compile_kwargs={"literal_binds": True})) rows = await self.database.fetch_all(expr) self.already_extracted.setdefault(target_name, {}).update({"raw": rows}) return table_prefix, rows