Я изучаю GraphQL, создавая простое приложение на Python, которое в основном запускает nmap
сканирование, сохраняет вывод в базу данных и может быть запрошено GraphQL API. Кажется, я немного запутался в том, как работает GraphQL.
У меня есть несколько таблиц, которые являются отношениями «один ко многим»: user has many scans
, scans have results
, results have hosts
, hosts have ports
, hosts have os
. Что я определил с помощью sqlalchemy
и использовал graphene
Теперь в моей схеме GraphQL у меня есть:
class Scans(SQLAlchemyObjectType):
class Meta:
model = ScansModel
class ScanResult(SQLAlchemyObjectType):
class Meta:
model = ScanResultModel
class Hosts(SQLAlchemyObjectType):
class Meta:
model = HostInfoModel
class Ports(SQLAlchemyObjectType):
class Meta:
model = PortInfoModel
class Os(SQLAlchemyObjectType):
class Meta:
model = OsInfoModel
class Query(graphene.ObjectType):
user = graphene.Field(User)
scans = graphene.List(Scans)
scan_results = graphene.List(ScanResult)
hosts = graphene.List(Hosts)
ports = graphene.List(Ports)
os = graphene.Field(Os)
def resolve_scans(self, info):
query = Scans.get_query(info)
return query
Теперь, когда я делаю запрос GraphQL, я могу запрашивать сканирование, результаты, информацию о хосте, портинфо, osinfo, без необходимости иметь преобразователи для этих полей. У меня создалось впечатление, что для каждого из этих полей потребуется преобразователь.
Кроме того, мне кажется, что я могу выполнять циклические запросы (так что из scanresults
я могу запросить scans
, а из scans
я могу запросить user
) благодаря внешним ключам и таблице отношений.
Это правильное поведение, или я неправильно понимаю, как работает GraphQL?