github.com/operandinc/gqlgen@v0.16.1/README.md (about)

     1  ![gqlgen](https://user-images.githubusercontent.com/980499/133180111-d064b38c-6eb9-444b-a60f-7005a6e68222.png)
     2  
     3  # gqlgen [![Integration](https://github.com/operandinc/gqlgen/actions/workflows/integration.yml/badge.svg)](https://github.com/operandinc/gqlgen/actions) [![Coverage Status](https://coveralls.io/repos/github/99designs/gqlgen/badge.svg?branch=master)](https://coveralls.io/github/99designs/gqlgen?branch=master) [![Go Report Card](https://goreportcard.com/badge/github.com/operandinc/gqlgen)](https://goreportcard.com/report/github.com/operandinc/gqlgen) [![Go Reference](https://pkg.go.dev/badge/github.com/operandinc/gqlgen.svg)](https://pkg.go.dev/github.com/operandinc/gqlgen) [![Read the Docs](https://badgen.net/badge/docs/available/green)](http://gqlgen.com/)
     4  
     5  ## What is gqlgen?
     6  
     7  [gqlgen](https://github.com/operandinc/gqlgen) is a Go library for building GraphQL servers without any fuss.<br/>
     8  
     9  - **gqlgen is based on a Schema first approach** — You get to Define your API using the GraphQL [Schema Definition Language](http://graphql.org/learn/schema/).
    10  - **gqlgen prioritizes Type safety** — You should never see `map[string]interface{}` here.
    11  - **gqlgen enables Codegen** — We generate the boring bits, so you can focus on building your app quickly.
    12  
    13  Still not convinced enough to use **gqlgen**? Compare **gqlgen** with other Go graphql [implementations](https://gqlgen.com/feature-comparison/)
    14  
    15  ## Quick start
    16  
    17  1. [Initialise a new go module](https://golang.org/doc/tutorial/create-module)
    18  
    19     mkdir example
    20     cd example
    21     go mod init example
    22  
    23  2. Add `github.com/operandinc/gqlgen` to your [project's tools.go](https://github.com/golang/go/wiki/Modules#how-can-i-track-tool-dependencies-for-a-module)
    24  
    25     printf '// +build tools\npackage tools\nimport \_ "github.com/operandinc/gqlgen"' | gofmt > tools.go
    26     go mod tidy
    27  
    28  3. Initialise gqlgen config and generate models
    29  
    30     go run github.com/operandinc/gqlgen init
    31     printf 'package model' | gofmt > graph/model/doc.go
    32  
    33  4. Start the graphql server
    34  
    35     go run server.go
    36  
    37  More help to get started:
    38  
    39  - [Getting started tutorial](https://gqlgen.com/getting-started/) - a comprehensive guide to help you get started
    40  - [Real-world examples](https://github.com/operandinc/gqlgen/tree/master/_examples) show how to create GraphQL applications
    41  - [Reference docs](https://pkg.go.dev/github.com/operandinc/gqlgen) for the APIs
    42  
    43  ## Reporting Issues
    44  
    45  If you think you've found a bug, or something isn't behaving the way you think it should, please raise an [issue](https://github.com/operandinc/gqlgen/issues) on GitHub.
    46  
    47  ## Contributing
    48  
    49  We welcome contributions, Read our [Contribution Guidelines](https://github.com/operandinc/gqlgen/blob/master/CONTRIBUTING.md) to learn more about contributing to **gqlgen**
    50  
    51  ## Frequently asked questions
    52  
    53  ### How do I prevent fetching child objects that might not be used?
    54  
    55  When you have nested or recursive schema like this:
    56  
    57  ```graphql
    58  type User {
    59  	id: ID!
    60  	name: String!
    61  	friends: [User!]!
    62  }
    63  ```
    64  
    65  You need to tell gqlgen that it should only fetch friends if the user requested it. There are two ways to do this;
    66  
    67  - #### Using Custom Models
    68  
    69  Write a custom model that omits the friends field:
    70  
    71  ```go
    72  type User struct {
    73    ID int
    74    Name string
    75  }
    76  ```
    77  
    78  And reference the model in `gqlgen.yml`:
    79  
    80  ```yaml
    81  # gqlgen.yml
    82  models:
    83    User:
    84      model: github.com/you/pkg/model.User # go import path to the User struct above
    85  ```
    86  
    87  - #### Using Explicit Resolvers
    88  
    89  If you want to Keep using the generated model, mark the field as requiring a resolver explicitly in `gqlgen.yml` like this:
    90  
    91  ```yaml
    92  # gqlgen.yml
    93  models:
    94    User:
    95      fields:
    96        friends:
    97          resolver: true # force a resolver to be generated
    98  ```
    99  
   100  After doing either of the above and running generate we will need to provide a resolver for friends:
   101  
   102  ```go
   103  func (r *userResolver) Friends(ctx context.Context, obj *User) ([]*User, error) {
   104    // select * from user where friendid = obj.ID
   105    return friends,  nil
   106  }
   107  ```
   108  
   109  You can also use inline config with directives to achieve the same result
   110  
   111  ```graphql
   112  directive @goModel(
   113  	model: String
   114  	models: [String!]
   115  ) on OBJECT | INPUT_OBJECT | SCALAR | ENUM | INTERFACE | UNION
   116  
   117  directive @goField(
   118  	forceResolver: Boolean
   119  	name: String
   120  ) on INPUT_FIELD_DEFINITION | FIELD_DEFINITION
   121  
   122  type User @goModel(model: "github.com/you/pkg/model.User") {
   123  	id: ID! @goField(name: "todoId")
   124  	friends: [User!]! @goField(forceResolver: true)
   125  }
   126  ```
   127  
   128  ### Can I change the type of the ID from type String to Type Int?
   129  
   130  Yes! You can by remapping it in config as seen below:
   131  
   132  ```yaml
   133  models:
   134    ID: # The GraphQL type ID is backed by
   135      model:
   136        - github.com/operandinc/gqlgen/graphql.IntID # a go integer
   137        - github.com/operandinc/gqlgen/graphql.ID # or a go string
   138  ```
   139  
   140  This means gqlgen will be able to automatically bind to strings or ints for models you have written yourself, but the
   141  first model in this list is used as the default type and it will always be used when:
   142  
   143  - Generating models based on schema
   144  - As arguments in resolvers
   145  
   146  There isn't any way around this, gqlgen has no way to know what you want in a given context.
   147  
   148  ## Other Resources
   149  
   150  - [Christopher Biscardi @ Gophercon UK 2018](https://youtu.be/FdURVezcdcw)
   151  - [Introducing gqlgen: a GraphQL Server Generator for Go](https://99designs.com.au/blog/engineering/gqlgen-a-graphql-server-generator-for-go/)
   152  - [Dive into GraphQL by Iván Corrales Solera](https://medium.com/@ivan.corrales.solera/dive-into-graphql-9bfedf22e1a)
   153  - [Sample Project built on gqlgen with Postgres by Oleg Shalygin](https://github.com/oshalygin/gqlgen-pg-todo-example)