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

如何编写作为中继连接返回SQLAlchemy的解析器?,sqlalchemy,graphene-python,Sqlalchemy,Graphene Python,我想返回一个中继连接以供查询。使用标准石墨烯sqlalchemy,您可以执行以下操作: class Query(graphene.ObjectType): node = relay.Node.Field() all_users = SQLAlchemyConnectionField(User) 对于需要更多自定义搜索的各种地方,最简单的方法是自定义解析器: class Query(graphene.ObjectType): node = relay.Node.Fiel

我想返回一个中继连接以供查询。使用标准石墨烯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类似的方式自动处理它

我有个主意

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)

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

我派生了另一个解决方案

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)

可能会对您有所帮助。

下面是一个示例代码,它添加了一个带有参数
q
search\u users
查询,以通过电子邮件过滤用户。结果是一个具有所有连接功能(排序、分页等)的UserConnection

导入石墨烯
从石墨烯进口继电器
从graphene_sqlalchemy导入SQLAlchemyObjectType,SQLAlchemyConnectionField
from.models将用户导入为UserModel
类用户(SQLAlchemyObject类型):
类元:
model=UserModel
接口=(relay.Node,)
类用户连接(中继连接):
类元:
节点=用户
类查询(graphene.ObjectType):
node=relay.node.Field()
search\u users=SQLAlchemyConnectionField(UserConnection,q=graphene.String())
def解析所有用户(自我、信息、**参数):
q=args.get(“q”)
users\u query=User.get\u query(信息)
#现在,我刚刚从UnsortedSQLAlchemyConnectionField复制了排序实现
#我没有找到更好的方法来重复使用此代码而不复制它:-(
如果参数中有“排序”:
sort=args['sort']
如果isinstance(排序、str):
users\u query=users\u query.order\u by(sort.value)
其他:
users\u query=users\u query.order\u by(*(排序中列的列值))
users=users\u query.filter(UserModel.email.contains(q)).all()
返回用户

主要问题是返回用户\u query.all()将查询所有数据有u any git repo@Keye myrie我认为您应该将问题的标题重命名为:“如何编写返回SQLAlchemyConnectionField的解析程序?”。