Using:  postgres 9.6  and latest sqlalchemy 1.1.4

I've been trying to port a query to a sqlalchemy query but have gotten an 
exception about an unrecognized keyword arg, which
confuses me as to whether the issue is my code or a bug in sqlalchemy: 
 TypeError: self_group() got an unexpected keyword argument 'against'



I've been trying to port the following query, which works in psql, to a 
sqlalchemy query:

-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

    select domain, json_agg(parts) as permissions from
            (select domain, row_to_json(r) as parts from
                    (select domain, action, array_agg(distinct target) as 
target from
                        (select (case when domain is null then '*' else 
domain end) as domain,
                                (case when target is null then '*' else 
target end) as target,
                                array_agg(distinct (case when action is 
null then '*' else action end)) as action
                           from permission
                          group by domain, target
                         ) x
                      group by domain, action)
              r) parts
        group by domain;

-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

The following sqlalchemy query raises the exception:

    thedomain = case([(Domain.name == None, '*')], else_=Domain.name)
        theaction = case([(Action.name == None, '*')], else_=Action.name)
        theresource = case([(Resource.name == None, '*')], 
else_=Resource.name)

        action_agg = func.array_agg(theaction.distinct())

        stmt1 = (
            session.query(thedomain.label('domain'),
                          theresource.label('resource'),
                          action_agg.label('action')).
            select_from(User).
            join(role_membership_table, User.pk_id == 
role_membership_table.c.user_id).
            join(role_permission_table, role_membership_table.c.role_id == 
role_permission_table.c.role_id).
            join(Permission, role_permission_table.c.permission_id == 
Permission.pk_id).
            outerjoin(Domain, Permission.domain_id == Domain.pk_id).
            outerjoin(Action, Permission.action_id == Action.pk_id).
            outerjoin(Resource, Permission.resource_id == Resource.pk_id).
            filter(User.identifier == identifier).
            group_by(Permission.domain_id, 
Permission.resource_id)).subquery()

        stmt2 = (session.query(stmt1.c.domain,
                               stmt1.c.action,
                               func.array_agg(stmt1.c.resource.distinct())).
                 select_from(stmt1).
                 group_by(stmt1.c.domain, stmt1.c.action)).subquery()

        stmt3 = (session.query(stmt2.c.domain,
                               func.row_to_json(stmt2)).
                 select_from(stmt2)).subquery()

        final = (session.query(stmt3.c.domain, func.json_agg(stmt3)).
                 select_from(stmt3).
                 group_by(stmt3.c.domain))

-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

Here's the exception trace:

...../yosai_alchemystore/accountstore/accountstore.py in 
_get_indexed_permissions_query(self, session, identifier)
    156 
    157         stmt3 = (session.query(stmt2.c.domain,
--> 158                                func.row_to_json(stmt2)).
    159                  select_from(stmt2)).subquery()
    160 

...../lib/python3.5/site-packages/sqlalchemy/sql/functions.py in 
__call__(self, *c, **kwargs)
    322 
    323         return Function(self.__names[-1],
--> 324                         packagenames=self.__names[0:-1], *c, **o)
    325 
    326 

...../lib/python3.5/site-packages/sqlalchemy/sql/functions.py in 
__init__(self, name, *clauses, **kw)
    432         self.type = sqltypes.to_instance(kw.get('type_', None))
    433 
--> 434         FunctionElement.__init__(self, *clauses, **kw)
    435 
    436     def _bind_param(self, operator, obj, type_=None):

...../lib/python3.5/site-packages/sqlalchemy/sql/functions.py in 
__init__(self, *clauses, **kwargs)
     60         self.clause_expr = ClauseList(
     61             operator=operators.comma_op,
---> 62             group_contents=True, *args).\
     63             self_group()
     64 

...../lib/python3.5/site-packages/sqlalchemy/sql/elements.py in 
__init__(self, *clauses, **kwargs)
   1783             self.clauses = [
   1784                 
text_converter(clause).self_group(against=self.operator)
-> 1785                 for clause in clauses]
   1786         else:
   1787             self.clauses = [

...../lib/python3.5/site-packages/sqlalchemy/sql/elements.py in 
<listcomp>(.0)
   1783             self.clauses = [
   1784                 
text_converter(clause).self_group(against=self.operator)
-> 1785                 for clause in clauses]
   1786         else:
   1787             self.clauses = [

TypeError: self_group() got an unexpected keyword argument 'against'

-- 
SQLAlchemy - 
The Python SQL Toolkit and Object Relational Mapper

http://www.sqlalchemy.org/

To post example code, please provide an MCVE: Minimal, Complete, and Verifiable 
Example.  See  http://stackoverflow.com/help/mcve for a full description.
--- 
You received this message because you are subscribed to the Google Groups 
"sqlalchemy" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to sqlalchemy+unsubscr...@googlegroups.com.
To post to this group, send email to sqlalchemy@googlegroups.com.
Visit this group at https://groups.google.com/group/sqlalchemy.
For more options, visit https://groups.google.com/d/optout.

Reply via email to