Gathering Data from GraphQL Endpoint¶
Using pynautobot to make GraphQL queries against Nautobot has the same initial setup as detailed in Creating a Pynautobot Instance.
import os
from pynautobot import api
url = "https://demo.nautobot.com"
# Retrieve token from system environment variable
# token = os.environ["NAUTOBOT_TOKEN"]
token = "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
nautobot = api(url=url, token=token)
An instance of GraphQLQuery
is assigned
to the above nautobot
object upon initialization.
The query()
method is used to
perform queries against Nautobot’s GraphQL endpoint.
Making a GraphQL Query¶
The query()
method requires
that a query string is passed into it.
The method retuns a GraphQLRecord
object
as discussed in The GraphQLRecord Object section.
This example demonstrates how to fetch the id, name, and parent name for all Locations.
>>> # Build a query string
>>> query = """
... query {
... locations {
... id
... name
... parent {
... name
... }
... }
... }
... """
>>>
>>> # Make a graphql query
>>> graphql_response = nautobot.graphql.query(query=query)
>>>
>>> # Show that a GraphQLRecord is returned
>>> graphql_response
GraphQLRecord(json={'data': {'locations': [{'id': ..., status_code=200)
The next example performs the same query, but restricts it to only the HQ
location.
>>> # Build a query string restricting only to HQ location
>>> query = """
... query {
... locations (name: "HQ") {
... id
... name
... parent {
... name
... }
... }
... }
... """
>>> graphql_response = nautobot.graphql.query(query=query)
>>> graphql_response
GraphQLRecord(json={'data': {'locations': [{'id': ..., 'name': 'HQ', 'parent': {'name': 'US'}}]}}, status_code=200)
Tip
Nautobot’s GraphQL documentation provides a summary of making queries.
Nautobot’s browsable API also provides a graphiql interface to aid in developing query strings at /graphql/
Making a GraphQL Query with Variables¶
The query()
method supports using variables in the query string by passing in an optional variables
argument.
This argument is a dictionary, with the key being the variable name, and the value being the value to use for the variable in the query string.
This example is the same as the previous one, except the location name is now derived using variables.
>>> # Create a variables dictionary
>>> variables = {"location_name": "HQ"}
>>>
>>> # Create a query string that takes variables
>>> query = """
... query ($location_name:String!) {
... locations (name: [$location_name]) {
... id
... name
... parent {
... name
... }
... }
... }
... """
>>>
>>> # Use the query method with variables
>>> graphql_response = nautobot.graphql.query(query=query, variables=variables)
>>> graphql_response
GraphQLRecord(json={'data': {'locations': [{'id': ..., 'name': 'HQ', 'parent': {'name': 'US'}}]}}, status_code=200)
The GraphQLRecord Object¶
The GraphQLRecord
object that is returned from making a query provides a json
attribute with the response from the API.
The json
attribute is a dictionary of the results from making the query.
This example shows accessing data from the previous query.
>>> variables = {"location_name": "HQ"}
>>> query = """
... query ($location_name:String!) {
... locations (name: [$location_name]) {
... id
... name
... parent {
... name
... }
... }
... }
... """
>>> graphql_response = nautobot.graphql.query(query=query, variables=variables)
>>> graphql_response.json
{
'data': {
'locations': [
{
'id': ...,
'name': 'HQ',
'parent': {
'name': 'US'
}
}
]
}
}
>>> # Get the name of the first location
>>> graphql_response.json["data"]["locations"][0]["name"]
'HQ'
Saving Changes¶
The Nautobot GraphQL API is currently read-only. To make updates to objects, see: