你如何编写一个将SQLAlchemy作为中继连接返回的解析器?

时间:2018-05-07 07:06:25

标签: sqlalchemy graphene-python

我想为查询返回中继连接。使用标准石墨烯 - sqlalchemy,您可以这样做:

class Query(graphene.ObjectType):
    node = relay.Node.Field()

    all_users = SQLAlchemyConnectionField(User)

对于需要更多自定义搜索的各种地方,最简单的方法是自定义解析器:

class Query(graphene.ObjectType):
    node = relay.Node.Field()


    all_users = graphene.List(User)
    def resolve_all_users(self, info, **args):
        # Grab the root SQLAlchemy query
        query = User.get_query(info)
        return query.filter(
            User.active,
            # and possibly a whole bunch of other filters)
        ).options(joinedload(User.emails).all()

这样可行,但它返回一个普通的用户列表,不支持SQLAlchemyConnectionField处理的分页或其他中继连接技巧。我正在寻找的是一种返回查询的方法,并以与SQLAlchemyConnectionField类似的方式自动处理它。

3 个答案:

答案 0 :(得分:0)

我有个主意。

def search_users(cls, info, **kwargs):
    user_query = UserQLSchema.get_query(info)
    target = kwargs.get('target')
    if target:
        target_like = "%{}%".format(target)
        user_query = orga_query.filter(UserModel.name.like(target_like))
    return user_query.all()

class RootQuery(graphene.ObjectType):
    find_users = graphene.relay.ConnectionField(OrganizationFullConnection, target=graphene.String(), resolver=search_users)

同时,还会出现另一个问题,导致每个网络请求两次查询数据库。

答案 1 :(得分:0)

我得出了另一个解决方案。

def search_users(cls, info, **kwargs):
    user_query = UserQLSchema.get_query(info)
    target = kwargs.get('target')
    if target:
        target_like = "%{}%".format(target)
        user_query = orga_query.filter(UserModel.name.like(target_like))
    return user_query

class RootQuery(graphene.ObjectType):
    find_users = SQLAlchemyConnectionField(UserQLSchema, target=graphene.String())

def resolve_find_users(self, info, **kwargs):
    return search_users(self, info, **kwargs)

可以帮助您。

答案 2 :(得分:0)

这是一个示例代码,其中添加了一个带有参数search_users的{​​{1}}查询,以通过电子邮件过滤用户。结果是具有所有连接功能(排序,分页等)的UserConnection

q