Exemple #1
0
    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
Exemple #2
0
    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
Exemple #3
0
 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
Exemple #4
0
    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