Bird
Raised Fist0
GraphQLquery~5 mins

SQL database resolvers in GraphQL - Cheat Sheet & Quick Revision

Choose your learning style10 modes available
Recall & Review
beginner
What is a SQL database resolver in GraphQL?
A SQL database resolver is a function in GraphQL that fetches data from a SQL database when a query or mutation is executed. It connects GraphQL queries to the database.
Click to reveal answer
beginner
How does a resolver function typically interact with a SQL database?
It runs SQL queries or commands to get or modify data, then returns the results to GraphQL to send back to the client.
Click to reveal answer
intermediate
Why do we use resolvers in GraphQL instead of direct SQL queries in the client?
Resolvers keep the database secure and hidden. They let the server control what data is sent and how, avoiding direct database access from clients.
Click to reveal answer
intermediate
What is the role of arguments in SQL database resolvers?
Arguments let clients specify details like which records to fetch or update. The resolver uses these to build the right SQL query.
Click to reveal answer
beginner
Give an example of a simple SQL database resolver for fetching a user by ID.
Example resolver: async function getUser(parent, args) { return await db.query('SELECT * FROM users WHERE id = ?', [args.id]); }
Click to reveal answer
What does a SQL database resolver do in GraphQL?
ACreates the GraphQL schema
BFetches or modifies data in a SQL database
CRuns client-side JavaScript
DStyles the GraphQL interface
Why should clients not run SQL queries directly in GraphQL?
ATo keep the database secure and control data access
BBecause SQL queries are too slow
CBecause GraphQL only works with NoSQL databases
DBecause SQL is not supported by GraphQL
What do resolver arguments help with?
AThey define the database schema
BThey style the GraphQL response
CThey run SQL commands on the client
DThey specify which data to fetch or update
Which of these is a typical step inside a SQL database resolver?
ARendering HTML
BCompiling CSS
CRunning a SQL query
DSending emails
What is returned by a SQL database resolver?
AData fetched from the database
BRaw SQL code
CGraphQL schema definitions
DClient-side scripts
Explain in your own words what a SQL database resolver does in a GraphQL server.
Think about how GraphQL gets data from a SQL database.
You got /4 concepts.
    Describe why using resolvers improves security compared to letting clients run SQL queries directly.
    Consider what could happen if clients had direct database access.
    You got /4 concepts.

      Practice

      (1/5)
      1. What is the main role of SQL database resolvers in a GraphQL server?
      easy
      A. To format the GraphQL query results into JSON
      B. To define the GraphQL schema types and fields
      C. To handle user authentication and authorization
      D. To fetch or modify data in the SQL database based on GraphQL queries or mutations

      Solution

      1. Step 1: Understand the purpose of resolvers

        Resolvers are functions that connect GraphQL queries or mutations to the actual data source, here an SQL database.
      2. Step 2: Identify the role in data fetching and modification

        Resolvers run SQL commands to get or change data as requested by the GraphQL operations.
      3. Final Answer:

        To fetch or modify data in the SQL database based on GraphQL queries or mutations -> Option D
      4. Quick Check:

        Resolvers connect queries to SQL data [OK]
      Hint: Resolvers link GraphQL queries to SQL commands [OK]
      Common Mistakes:
      • Confusing resolvers with schema definitions
      • Thinking resolvers handle authentication
      • Assuming resolvers format output only
      2. Which of the following is the correct way to define a resolver function for a GraphQL query named getUser that fetches user data from an SQL database?
      easy
      A. const resolvers = { Query: { getUser: () => db.query('SELECT * FROM users') } };
      B. const resolvers = { Mutation: { getUser: () => db.query('SELECT * FROM users') } };
      C. const resolvers = { Query: { getUser: 'SELECT * FROM users' } };
      D. const resolvers = { getUser: () => db.query('SELECT * FROM users') };

      Solution

      1. Step 1: Identify the correct resolver structure for a query

        Resolvers for queries are defined inside the Query object with function values.
      2. Step 2: Check the syntax for calling the database query

        The resolver should be a function returning the result of db.query with the SQL command string.
      3. Final Answer:

        const resolvers = { Query: { getUser: () => db.query('SELECT * FROM users') } }; -> Option A
      4. Quick Check:

        Query resolvers are functions inside Query object [OK]
      Hint: Query resolvers go inside Query object as functions [OK]
      Common Mistakes:
      • Placing query resolver inside Mutation
      • Assigning SQL string directly instead of a function
      • Defining resolver outside Query or Mutation objects
      3. Given the resolver below, what will be the output when the GraphQL query { getUserById(id: 2) { name } } is executed?
      const resolvers = {
        Query: {
          getUserById: (_, args) => {
            const users = [
              { id: 1, name: 'Alice' },
              { id: 2, name: 'Bob' },
              { id: 3, name: 'Carol' }
            ];
            return users.find(user => user.id === args.id);
          }
        }
      };
      medium
      A. { "data": { "getUserById": { "name": "Alice" } } }
      B. { "data": { "getUserById": { "name": "Bob" } } }
      C. { "data": { "getUserById": null } }
      D. Error: args.id is undefined

      Solution

      1. Step 1: Understand the resolver logic

        The resolver searches the users array for an object with id equal to args.id.
      2. Step 2: Match the query argument with the array data

        The query requests id: 2, so the resolver returns the user with id: 2, which is { id: 2, name: 'Bob' }.
      3. Final Answer:

        { "data": { "getUserById": { "name": "Bob" } } } -> Option B
      4. Quick Check:

        Find user with id 2 = Bob [OK]
      Hint: Find user by id in array using args.id [OK]
      Common Mistakes:
      • Confusing id 2 with id 1 or 3
      • Forgetting to access args.id
      • Assuming resolver returns entire user object without filtering
      4. Identify the error in this resolver code snippet for a mutation that inserts a new user into the SQL database:
      const resolvers = {
        Mutation: {
          addUser: (parent, args) => {
            db.query(`INSERT INTO users (name, email) VALUES (${args.name}, ${args.email})`);
            return { success: true };
          }
        }
      };
      medium
      A. SQL injection risk due to string interpolation without parameterization
      B. Missing return statement for the inserted user data
      C. Incorrect resolver placement inside Mutation instead of Query
      D. Using backticks instead of single quotes for SQL string

      Solution

      1. Step 1: Analyze the SQL query construction

        The SQL command uses string interpolation to insert args.name and args.email directly into the query string.
      2. Step 2: Identify security risk

        This approach allows SQL injection attacks if user input contains malicious SQL code. Proper parameterization or prepared statements are needed.
      3. Final Answer:

        SQL injection risk due to string interpolation without parameterization -> Option A
      4. Quick Check:

        Unsafe string interpolation causes SQL injection [OK]
      Hint: Never insert variables directly into SQL strings [OK]
      Common Mistakes:
      • Ignoring SQL injection vulnerability
      • Thinking backticks cause errors
      • Expecting mutation in Query object
      5. You want to write a resolver that fetches all orders for a user, but only if the user is active. The SQL tables are users(id, active) and orders(id, user_id, total). Which resolver implementation correctly enforces this condition efficiently?
      hard
      A. const resolvers = { Query: { userOrders: (_, args) => db.query(`SELECT * FROM orders WHERE user_id = ${args.userId}`) } };
      B. const resolvers = { Query: { userOrders: (_, args) => { const user = db.query(`SELECT * FROM users WHERE id = ${args.userId}`); if (user.active) { return db.query(`SELECT * FROM orders WHERE user_id = ${args.userId}`); } else { return []; } } } };
      C. const resolvers = { Query: { userOrders: (_, args) => db.query(`SELECT * FROM orders WHERE user_id = ${args.userId} AND EXISTS (SELECT 1 FROM users WHERE id = ${args.userId} AND active = TRUE)`) } };
      D. const resolvers = { Query: { userOrders: (_, args) => db.query(`SELECT * FROM users WHERE id = ${args.userId} AND active = TRUE`) } };

      Solution

      1. Step 1: Understand the requirement

        Fetch orders only if the user is active, combining the check and data fetch efficiently.
      2. Step 2: Evaluate each option

        const resolvers = { Query: { userOrders: (_, args) => db.query(`SELECT * FROM orders WHERE user_id = ${args.userId} AND EXISTS (SELECT 1 FROM users WHERE id = ${args.userId} AND active = TRUE)`) } }; uses a single SQL query with EXISTS to check user active status and fetch orders in one call, which is efficient and correct.
        const resolvers = { Query: { userOrders: (_, args) => { const user = db.query(`SELECT * FROM users WHERE id = ${args.userId}`); if (user.active) { return db.query(`SELECT * FROM orders WHERE user_id = ${args.userId}`); } else { return []; } } } }; fetches user first then orders separately, causing multiple queries and possible async issues.
        const resolvers = { Query: { userOrders: (_, args) => db.query(`SELECT * FROM orders WHERE user_id = ${args.userId}`) } }; fetches orders without checking user active status.
        const resolvers = { Query: { userOrders: (_, args) => db.query(`SELECT * FROM users WHERE id = ${args.userId} AND active = TRUE`) } }; fetches user data only, not orders.
      3. Final Answer:

        const resolvers = { Query: { userOrders: (_, args) => db.query(`SELECT * FROM orders WHERE user_id = ${args.userId} AND EXISTS (SELECT 1 FROM users WHERE id = ${args.userId} AND active = TRUE)`) } }; -> Option C
      4. Quick Check:

        Single query with EXISTS enforces condition efficiently [OK]
      Hint: Use EXISTS in SQL to combine condition and fetch in one query [OK]
      Common Mistakes:
      • Running multiple queries instead of one
      • Not checking user active status before fetching orders
      • Returning user data instead of orders
      Recommended

      Ready to prove it?

      Pass the test and this pattern moves unknown strong while earning +1 Grip toward your certificate.

      10 questions~5 mineasy hard