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