在一对多的情况下,如果您具有如下所示的表设置(非常简单的一对多关系),则如果tableB具有任何实际数据量,则GraphQL查询将超时。
TableB总共约有40万条记录。 Graphene-sqlalchemy将查询TableA,然后当石墨烯对其进行调用时,SQLAlchemy本身将尝试解析表的关系。发生这种情况时,查询将发送到数据库,但不会在足够的时间内返回(它回退〜1GB的数据,因为它试图拉出子表上的每个单个字段)。
我将其范围缩小到了石墨烯/types/resolver.py
def attr_resolver(attname, default_value, root, info, **args):
return getattr(root, attname, default_value)
石墨烯捕获TableA信息,然后在解析TableB时,将使用{TableA”模型填充root
参数,SQLAlchemy然后尝试完全解析40万条记录,查询超时然后失败。 / p>
query{
tableA(first: 10){
edges{
node{
tableB(first: 5){
edges{
node{
fieldA
}
}
}
}
}
}
}