github.com/animeshon/gqlgen@v0.13.1-0.20210304133704-3a770431bb6d/README.md (about) 1 # gqlgen [![Continuous Integration](https://github.com/99designs/gqlgen/workflows/Continuous%20Integration/badge.svg)](https://github.com/99designs/gqlgen/actions) [![Read the Docs](https://badgen.net/badge/docs/available/green)](http://gqlgen.com/) [![GoDoc](https://godoc.org/github.com/99designs/gqlgen?status.svg)](https://godoc.org/github.com/99designs/gqlgen) 2 3 ![gqlgen](https://user-images.githubusercontent.com/46195831/89802919-0bb8ef00-db2a-11ea-8ba4-88e7a58b2fd2.png) 4 5 ## What is gqlgen? 6 7 [gqlgen](https://github.com/99designs/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 ## Getting Started 16 - To install gqlgen run the command `go get github.com/99designs/gqlgen` in your project directory.<br/> 17 - You could initialize a new project using the recommended folder structure by running this command `go run github.com/99designs/gqlgen init`. 18 19 You could find a more comprehensive guide to help you get started [here](https://gqlgen.com/getting-started/).<br/> 20 We also have a couple of real-world [examples](https://github.com/99designs/gqlgen/tree/master/example) that show how to GraphQL applications with **gqlgen** seamlessly, 21 You can see these [examples](https://github.com/99designs/gqlgen/tree/master/example) here or visit [godoc](https://godoc.org/github.com/99designs/gqlgen). 22 23 ## Reporting Issues 24 25 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. 26 27 ## Contributing 28 29 We welcome contributions, Read our [Contribution Guidelines](https://github.com/99designs/gqlgen/blob/master/CONTRIBUTING.md) to learn more about contributing to **gqlgen** 30 ## Frequently asked questions 31 32 ### How do I prevent fetching child objects that might not be used? 33 34 When you have nested or recursive schema like this: 35 36 ```graphql 37 type User { 38 id: ID! 39 name: String! 40 friends: [User!]! 41 } 42 ``` 43 44 You need to tell gqlgen that it should only fetch friends if the user requested it. There are two ways to do this; 45 46 - #### Using Custom Models 47 48 Write a custom model that omits the friends field: 49 50 ```go 51 type User struct { 52 ID int 53 Name string 54 } 55 ``` 56 57 And reference the model in `gqlgen.yml`: 58 59 ```yaml 60 # gqlgen.yml 61 models: 62 User: 63 model: github.com/you/pkg/model.User # go import path to the User struct above 64 ``` 65 66 - #### Using Explicit Resolvers 67 68 If you want to Keep using the generated model, mark the field as requiring a resolver explicitly in `gqlgen.yml` like this: 69 70 ```yaml 71 # gqlgen.yml 72 models: 73 User: 74 fields: 75 friends: 76 resolver: true # force a resolver to be generated 77 ``` 78 79 After doing either of the above and running generate we will need to provide a resolver for friends: 80 81 ```go 82 func (r *userResolver) Friends(ctx context.Context, obj *User) ([]*User, error) { 83 // select * from user where friendid = obj.ID 84 return friends, nil 85 } 86 ``` 87 88 ### Can I change the type of the ID from type String to Type Int? 89 90 Yes! You can by remapping it in config as seen below: 91 92 ```yaml 93 models: 94 ID: # The GraphQL type ID is backed by 95 model: 96 - github.com/99designs/gqlgen/graphql.IntID # An go integer 97 - github.com/99designs/gqlgen/graphql.ID # or a go string 98 ``` 99 100 This means gqlgen will be able to automatically bind to strings or ints for models you have written yourself, but the 101 first model in this list is used as the default type and it will always be used when: 102 103 - Generating models based on schema 104 - As arguments in resolvers 105 106 There isn't any way around this, gqlgen has no way to know what you want in a given context. 107 108 ## Other Resources 109 110 - [Christopher Biscardi @ Gophercon UK 2018](https://youtu.be/FdURVezcdcw) 111 - [Introducing gqlgen: a GraphQL Server Generator for Go](https://99designs.com.au/blog/engineering/gqlgen-a-graphql-server-generator-for-go/) 112 - [Dive into GraphQL by Iván Corrales Solera](https://medium.com/@ivan.corrales.solera/dive-into-graphql-9bfedf22e1a) 113 - [Sample Project built on gqlgen with Postgres by Oleg Shalygin](https://github.com/oshalygin/gqlgen-pg-todo-example)