рд░реЗрдЦрд╛рдВрдХрди рдПрдкреАрдЖрдИ (CRUD) рдЧреЛ рдкрд░

рдЫрд╡рд┐


рд╕рднреА рдХреЛ рдирдорд╕реНрдХрд╛рд░! рдЧреНрд░рд╛рдл рдкрд░ рд╣реЗрдЧрд▓рд╛рдЗрди рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╣реБрдд рд╕рд╛рд░реЗ рд▓реЗрдЦ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдЙрдирдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЪрд▓рдиреЗ рдкрд░ рдореИрдВрдиреЗ рдкрд╛рдпрд╛ рдХрд┐ рд╡реЗ рд╕рднреА рдЧреЛ рдЬреИрд╕реА рдЕрджреНрднреБрдд рднрд╛рд╖рд╛ рдХреЛ рджрд░рдХрд┐рдирд╛рд░ рдХрд░рддреЗ рд╣реИрдВред рдЖрдЬ рдореИрдВ рдЗрд╕ рдЧрд▓рддрдлрд╣рдореА рдХреЛ рджреВрд░ рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░реВрдВрдЧрд╛ред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо рдЧреНрд░рд╛рдлрдХреНрд▓рд╛рдЗрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЧреЛ рдкрд░ рдПрдХ рдПрдкреАрдЖрдИ рд▓рд┐рдЦреЗрдВрдЧреЗред


рд╕рдВрдХреНрд╖реЗрдк рдореЗрдВ: рдЧреНрд░рд╛рдлрдХреЙрд▓ рдПрдХ рдПрдкреАрдЖрдИ рдХреЗ рдирд┐рд░реНрдорд╛рдг рдХреЗ рд▓рд┐рдП рдПрдХ рдХреНрд╡реЗрд░реА рд▓реИрдВрдЧреНрд╡реЗрдЬ рд╣реИ рдЬрд┐рд╕рдореЗрдВ рдбреЗрдЯрд╛ рдХреЗ рдЕрдиреБрд░реЛрдз рдФрд░ рд╡рд╛рдкрд╕реА рдХреЗ рд░реВрдк рдореЗрдВ рд╡рд░реНрдгрди рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ (рдЖрдзрд┐рдХрд╛рд░рд┐рдХ рд╕рдВрд╕рд╛рдзрди graphql.imtqy.com рдкрд░ рдФрд░ рд╣рдм рдкрд░ рдЕрдзрд┐рдХ рд╡рд┐рд╕реНрддреГрдд рдЬрд╛рдирдХрд╛рд░реА)


рдЖрдк рддрд░реНрдХ рджреЗ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдпрд╣рд╛рдВ рдЧреНрд░рд╛рдлрдХреИрд▓ рдпрд╛ рд░реЗрд╕реНрдЯ рдмреЗрд╣рддрд░ рд╣реИред


рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдСрдирд▓рд╛рдЗрди рд╕реНрдЯреЛрд░ рдореЗрдВ рдЙрддреНрдкрд╛рджреЛрдВ рдХреЛ рдЬреЛрдбрд╝рдиреЗ, рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ, рд╕рдВрдкрд╛рджрд┐рдд рдХрд░рдиреЗ рдФрд░ рд╣рдЯрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдХреНрд▓рд╛рд╕рд┐рдХ рдПрдкреАрдЖрдИ: CRUD (рдХреНрд░рд┐рдПрдЯ, рд░реАрдб, рдЕрдкрдбреЗрдЯ, рдбрд┐рд▓реАрдЯ) рд╣реЛрдЧрд╛ред
рд╕рд░реНрд╡рд░ рдХреА рддрд░рдл, рд╣рдо рдЧреНрд░рд╛рдлрдХреНрдпреВрдПрд▓ рдЧреНрд░рд╛рдлрдХрд▓- рдЧреЛ рдХреЗ рддреИрдпрд╛рд░ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗ


рдкрд╣рд▓реЗ рдЖрдкрдХреЛ рдЧреНрд░рд╛рдлрдХрд▓-рдЧреЛ рдбрд╛рдЙрдирд▓реЛрдб рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдпрд╣ рдХрдорд╛рдВрдб рдХреЗ рд╕рд╛рде рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ


go get github.com/graphql-go/graphql 

рдЕрдЧрд▓рд╛, рд╣рдо рдЙрддреНрдкрд╛рдж рдХреА рд╕рдВрд░рдЪрдирд╛ рдХрд╛ рд╡рд░реНрдгрди рдХрд░рддреЗ рд╣реИрдВ (рд╕рд░рд▓реАрдХреГрдд рд░реВрдк рдореЗрдВ)


 type Product struct { ID int64 `json:"id"` Name string `json:"name"` Info string `json:"info,omitempty"` Price float64 `json:"price"` } 

ID - рд╡рд┐рд╢рд┐рд╖реНрдЯ рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛, Name - рдирд╛рдо, Info - рдЙрддреНрдкрд╛рдж рдЬрд╛рдирдХрд╛рд░реА, Price - рдореВрд▓реНрдп


рдкрд╣рд▓реА рдмрд╛рдд рдпрд╣ рд╣реИ рдХрд┐ Do рд╡рд┐рдзрд┐ рдХреЛ рдХреЙрд▓ рдХрд░реЗрдВ, рдЬреЛ рдбреЗрдЯрд╛ рд╕реНрдХреАрдо рдФрд░ рдХреНрд╡реЗрд░реА рдкреИрд░рд╛рдореАрдЯрд░ рдХреЛ рдЗрдирдкреБрдЯ рдорд╛рдкрджрдВрдбреЛрдВ рдХреЗ рд░реВрдк рдореЗрдВ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рддрд╛ рд╣реИред рдФрд░ рдпрд╣ рдкрд░рд┐рдгрд╛рдореА рдбреЗрдЯрд╛ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рд▓реМрдЯрд╛ рджреЗрдЧрд╛ (рдЧреНрд░рд╛рд╣рдХ рдХреЛ рдФрд░ рдкреНрд░рд╕рд╛рд░рдг рдХреЗ рд▓рд┐рдП)


 result := graphql.Do(graphql.Params{ Schema: schema, RequestString: query, }) 

рдкреВрд░реНрдг рдХреЛрдб
 func executeQuery(query string, schema graphql.Schema) *graphql.Result { result := graphql.Do(graphql.Params{ Schema: schema, RequestString: query, }) if len(result.Errors) > 0 { fmt.Printf("errors: %v", result.Errors) } return result } func main() { http.HandleFunc("/product", func(w http.ResponseWriter, r *http.Request) { result := executeQuery(r.URL.Query().Get("query"), schema) json.NewEncoder(w).Encode(result) }) http.ListenAndServe(":8080", nil) } 

Schema - рдбреЗрдЯрд╛ рд╕реНрдХреАрдо, RequestString - рд╣рдорд╛рд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ рдХреНрд╡реЗрд░реА рд╕реНрдЯреНрд░рд┐рдВрдЧ рдкреИрд░рд╛рдореАрдЯрд░ рдХрд╛ рдорд╛рди, query рдорд╛рди


рд╕реНрдХреАрдорд╛ (рдпреЛрдЬрдирд╛)


рдПрдХ рд╕реНрдХреАрдорд╛ рджреЛ рд░реВрдЯ рдбреЗрдЯрд╛ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЛ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рддрд╛ рд╣реИ: Query - рдЕрдкрд░рд┐рд╡рд░реНрддрдиреАрдп рдбреЗрдЯрд╛, Mutation - рдЙрддреНрдкрд░рд┐рд╡рд░реНрддрдиреАрдп рдбреЗрдЯрд╛


 var schema, _ = graphql.NewSchema( graphql.SchemaConfig{ Query: queryType, Mutation: mutationType, }, ) 

рдХреНрд╡реЗрд░реА ()


Query рдХрд╛ рдЙрдкрдпреЛрдЧ (рдФрд░ рдХреЗрд╡рд▓ рдкрдврд╝рдиреЗ рдХреЗ рд▓рд┐рдП) рдбреЗрдЯрд╛ рдкрдврд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред Query рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП Query рд╣рдо рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рддреЗ рд╣реИрдВ рдХрд┐ рд╕рд░реНрд╡рд░ рдХреЛ рдХрд┐рд╕ рдбреЗрдЯрд╛ рдкрд░ рд╡рд╛рдкрд╕ рд▓реМрдЯрдирд╛ рдЪрд╛рд╣рд┐рдПред
рд╣рдо Query рдбреЗрдЯрд╛ рдкреНрд░рдХрд╛рд░ рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЛ рд▓рд┐рдЦреЗрдВрдЧреЗ, рд╣рдорд╛рд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ рдЗрд╕рдореЗрдВ рдПрдХрд▓ рдЙрддреНрдкрд╛рдж (рдЙрддреНрдкрд╛рдж) рдФрд░ рдорд╛рд▓ рдХреА рд╕реВрдЪреА (рд╕реВрдЪреА) рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдирдХрд╛рд░реА рд╣реЛрдЧреАред


 var queryType = graphql.NewObject( graphql.ObjectConfig{ Name: "Query", Fields: graphql.Fields{ /*    ID http://localhost:8080/product?query={product(id:1){name,info,price}} */ "product": &graphql.Field{ Type: productType, Description: "Get product by id", //   ,    Args: graphql.FieldConfigArgument{ //       id "id": &graphql.ArgumentConfig{ Type: graphql.Int, }, }, Resolve: func(p graphql.ResolveParams) (interface{}, error) { id, ok := p.Args["id"].(int) if ok { //    ID for _, product := range products { if int(product.ID) == id { return product, nil } } } return nil, nil }, }, /*    http://localhost:8080/product?query={list{id,name,info,price}} */ "list": &graphql.Field{ Type: graphql.NewList(productType), Description: "Get product list", Resolve: func(params graphql.ResolveParams) (interface{}, error) { return products, nil }, }, }, }) 

рдХреНрд╡реЗрд░реА рдЯрд╛рдЗрдк рдореЗрдВ рдЖрд╡рд╢реНрдпрдХ Name рдФрд░ Fields , рд╕рд╛рде рд╣реА рд╡реИрдХрд▓реНрдкрд┐рдХ Description (рдкреНрд░рд▓реЗрдЦрди рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ)
рдмрджрд▓реЗ рдореЗрдВ, Fields рдлрд╝реАрд▓реНрдб рдореЗрдВ рдЖрд╡рд╢реНрдпрдХ Type рдлрд╝реАрд▓реНрдб рдФрд░ рд╡реИрдХрд▓реНрдкрд┐рдХ Args , Resolve рдФрд░ Description рдлрд╝реАрд▓реНрдб рднреА рд╢рд╛рдорд┐рд▓ рд╣реИрдВ


рдЖрд░реНрдЧреНрд╕ (рддрд░реНрдХ)


рддрд░реНрдХ - рдХреНрд▓рд╛рдЗрдВрдЯ рд╕реЗ рд╕рд░реНрд╡рд░ рдореЗрдВ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд┐рдП рдЧрдП рдорд╛рдкрджрдВрдбреЛрдВ рдХреА рдПрдХ рд╕реВрдЪреА рдФрд░ рд▓реМрдЯреЗ рдбреЗрдЯрд╛ рдХреЗ рдкрд░рд┐рдгрд╛рдо рдХреЛ рдкреНрд░рднрд╛рд╡рд┐рдд рдХрд░рдирд╛ред рддрд░реНрдХ рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдХреНрд╖реЗрддреНрд░ рд╕реЗ рдЬреБрдбрд╝реЗ рд╣реЛрддреЗ рд╣реИрдВред рдФрд░ рддрд░реНрдХ рдХреЛ Query рдФрд░ Mutation рджреЛрдиреЛрдВ рдореЗрдВ рдкрд╛рд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред


 ?query={product(id:1){name,info,price}} 

рдЗрд╕ рд╕реНрдерд┐рддрд┐ рдореЗрдВ, 1 рдХреЗ рдорд╛рди рдХреЗ рд╕рд╛рде product рдлрд╝реАрд▓реНрдб рдХреЗ рд▓рд┐рдП id рддрд░реНрдХ рдЗрдВрдЧрд┐рдд рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛ рдХреЗ рд╕рд╛рде рдЙрддреНрдкрд╛рдж рдХреЛ рд╡рд╛рдкрд╕ рдХрд░рдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реИред
list рдХреЗ list рддрд░реНрдХреЛрдВ рдХреЛ рдЫреЛрдбрд╝ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдПрдХ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдореЗрдВ рдпрд╣ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП: limit рдФрд░ offset ред


рд╕рдВрдХрд▓реНрдк (рдорд╛рдиреНрдпрддрд╛)


рдбреЗрдЯрд╛ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд╕рднреА рддрд░реНрдХ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдбреЗрдЯрд╛рдмреЗрд╕ рдХреНрд╡реЗрд░реА, рдкреНрд░реЛрд╕реЗрд╕рд┐рдВрдЧ рдФрд░ рдлрд╝рд┐рд▓реНрдЯрд░рд┐рдВрдЧ) рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛рдУрдВ рдореЗрдВ рд╣реИрдВ, рдпрд╣ рд╡рд╣ рд╣реИ рдЬреЛ рдбреЗрдЯрд╛ рдХреЛ рд╡рд╛рдкрд╕ рдХрд░ рджреЗрддрд╛ рд╣реИ рдЬрд┐рд╕реЗ рдХреНрд▓рд╛рдЗрдВрдЯ рдХреЛ рдЕрдиреБрд░реЛрдз рдХреЗ рдЬрд╡рд╛рдм рдХреЗ рд░реВрдк рдореЗрдВ рдкреНрд░реЗрд╖рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред


рдкреНрд░рдХрд╛рд░ (рдкреНрд░рдХрд╛рд░ рдкреНрд░рдгрд╛рд▓реА)


GraphQL рдбреЗрдЯрд╛ рдХрд╛ рд╡рд░реНрдгрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдкрдиреЗ рдкреНрд░рдХрд╛рд░ рдкреНрд░рдгрд╛рд▓реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИред рдЖрдк рджреЛрдиреЛрдВ рдореВрд▓ рдкреНрд░рдХрд╛рд░реЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ String , Int , Float , Boolean , рдФрд░ рдЕрдкрдиреЗ рд╕реНрд╡рдпрдВ рдХреЗ (рдХрд╕реНрдЯрдо) рд╡рд╛рд▓реЗред рд╣рдорд╛рд░реЗ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд╣рдореЗрдВ рдПрдХ рдХрд╕реНрдЯрдо рдкреНрд░рдХрд╛рд░ рдХреЗ Product рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреА, рдЬреЛ Product рд╕рднреА рдЧреБрдгреЛрдВ рдХрд╛ рд╡рд░реНрдгрди рдХрд░реЗрдЧрд╛


 var productType = graphql.NewObject( graphql.ObjectConfig{ Name: "Product", Fields: graphql.Fields{ "id": &graphql.Field{ Type: graphql.Int, }, "name": &graphql.Field{ Type: graphql.String, }, "info": &graphql.Field{ Type: graphql.String, }, "price": &graphql.Field{ Type: graphql.Float, }, }, }, ) 

рдкреНрд░рддреНрдпреЗрдХ рдХреНрд╖реЗрддреНрд░ рдХреЗ рд▓рд┐рдП, рдмреЗрд╕ рдкреНрд░рдХрд╛рд░ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ graphql.Int , graphql.String , graphql.Float ред
рдиреЗрд╕реНрдЯреЗрдб рдлрд╝реАрд▓реНрдб рдХреА рд╕рдВрдЦреНрдпрд╛ рд╕реАрдорд┐рдд рдирд╣реАрдВ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЖрдк рдХрд┐рд╕реА рднреА рд╕реНрддрд░ рдХреЗ рдЧреНрд░рд╛рдл рд╕рд┐рд╕реНрдЯрдо рдХреЛ рд▓рд╛рдЧреВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред


рдЙрддреНрдкрд░рд┐рд╡рд░реНрддрди (рдореНрдпреВрдЯреЗрд╢рди)


рдЙрддреНрдкрд░рд┐рд╡рд░реНрддрди рдпреЗ рдЙрддреНрдкрд░рд┐рд╡рд░реНрддрдиреАрдп рдбреЗрдЯрд╛ рд╣реИрдВ, рдЬрд┐рдирдореЗрдВ рд╢рд╛рдорд┐рд▓ рд╣реИрдВ: рдЬреЛрдбрд╝, рд╕рдВрдкрд╛рджрди рдФрд░ рд╡рд┐рд▓реЛрдкрдиред рдЕрдиреНрдпрдерд╛, рдореНрдпреВрдЯреЗрд╢рди рдмрд╣реБрдд рд╣реА рдирд┐рдпрдорд┐рдд рдкреНрд░рд╢реНрдиреЛрдВ рдХреЗ рд╕рдорд╛рди рд╣реИрдВ: рд╡реЗ Args рддрд░реНрдХ рднреА рд▓реЗрддреЗ рд╣реИрдВ рдФрд░ рдХреНрд╡реЗрд░реА рдХреЗ рдЬрд╡рд╛рдм рдХреЗ рд░реВрдк рдореЗрдВ Args рдбреЗрдЯрд╛ рд╡рд╛рдкрд╕ рдХрд░рддреЗ рд╣реИрдВред


рдЖрдЗрдП рд╣рдорд╛рд░реЗ рдЙрддреНрдкрд╛рджреЛрдВ рдХреЗ рд▓рд┐рдП рдореНрдпреВрдЯреЗрд╢рди рд▓рд┐рдЦреЗрдВред
  var mutationType = graphql.NewObject(graphql.ObjectConfig{ Name: "Mutation", Fields: graphql.Fields{ /*    http://localhost:8080/product?query=mutation+_{create(name:"Tequila",info:"Alcohol",price:99){id,name,info,price}} */ "create": &graphql.Field{ Type: productType, Description: "Create new product", Args: graphql.FieldConfigArgument{ "name": &graphql.ArgumentConfig{ Type: graphql.NewNonNull(graphql.String), //     }, "info": &graphql.ArgumentConfig{ Type: graphql.String, //    }, "price": &graphql.ArgumentConfig{ Type: graphql.NewNonNull(graphql.Float), }, }, Resolve: func(params graphql.ResolveParams) (interface{}, error) { rand.Seed(time.Now().UnixNano()) product := Product{ ID: int64(rand.Intn(100000)), //   ID Name: params.Args["name"].(string), Info: params.Args["info"].(string), Price: params.Args["price"].(float64), } products = append(products, product) return product, nil }, }, /*    id http://localhost:8080/product?query=mutation+_{update(id:1,price:195){id,name,info,price}} */ "update": &graphql.Field{ Type: productType, Description: "Update product by id", Args: graphql.FieldConfigArgument{ "id": &graphql.ArgumentConfig{ Type: graphql.NewNonNull(graphql.Int), }, "name": &graphql.ArgumentConfig{ Type: graphql.String, }, "info": &graphql.ArgumentConfig{ Type: graphql.String, }, "price": &graphql.ArgumentConfig{ Type: graphql.Float, }, }, Resolve: func(params graphql.ResolveParams) (interface{}, error) { id, _ := params.Args["id"].(int) name, nameOk := params.Args["name"].(string) info, infoOk := params.Args["info"].(string) price, priceOk := params.Args["price"].(float64) product := Product{} for i, p := range products { //     if int64(id) == p.ID { if nameOk { products[i].Name = name } if infoOk { products[i].Info = info } if priceOk { products[i].Price = price } product = products[i] break } } return product, nil }, }, /*    id http://localhost:8080/product?query=mutation+_{delete(id:1){id,name,info,price}} */ "delete": &graphql.Field{ Type: productType, Description: "Delete product by id", Args: graphql.FieldConfigArgument{ "id": &graphql.ArgumentConfig{ Type: graphql.NewNonNull(graphql.Int), }, }, Resolve: func(params graphql.ResolveParams) (interface{}, error) { id, _ := params.Args["id"].(int) product := Product{} for i, p := range products { if int64(id) == p.ID { product = products[i] //     products = append(products[:i], products[i+1:]...) } } return product, nil }, }, }, }) 

рд╕рднреА queryType ред рдХреЗрд╡рд▓ рдПрдХ рдЫреЛрдЯреА рд╕реА рд╡рд┐рд╢реЗрд╖рддрд╛ рд╣реИ, graphql.NewNonNull(graphql.Int) рдЯрд╛рдЗрдк рдХрд░реЗрдВ, рдЬреЛ рд╣рдореЗрдВ рдмрддрд╛рддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдХреНрд╖реЗрддреНрд░ рдЦрд╛рд▓реА рдирд╣реАрдВ рд╣реЛ рд╕рдХрддрд╛ (MySQL рдореЗрдВ NOT NULL рд╕рдорд╛рди NOT NULL )


рд╡рд╣ рд╕рдм рд╣реИред рдЕрдм рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рд╕рд╛рдорд╛рдиреЛрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рд░рд▓ рдЧреЛ CRUD рдПрдкреАрдЖрдИ рд╣реИред рд╣рдордиреЗ рдЗрд╕ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рдбреЗрдЯрд╛рдмреЗрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд┐рдпрд╛, рд▓реЗрдХрд┐рди рд╣рдордиреЗ рджреЗрдЦрд╛ рдХрд┐ рдбреЗрдЯрд╛ рдореЙрдбрд▓ рдХреИрд╕реЗ рдмрдирд╛рдпрд╛ рдЬрд╛рдП рдФрд░ рдореНрдпреВрдЯреЗрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЙрдирдореЗрдВ рд╣реЗрд░рдлреЗрд░ рдХрд┐рдпрд╛ рдЬрд╛рдПред


рдЙрджрд╛рд╣рд░рдг


рдпрджрд┐ рдЖрдкрдиреЗ рд╕реНрд░реЛрдд рдХреЛ рдбрд╛рдЙрдирд▓реЛрдб рдХрд┐рдпрд╛ рд╣реИ


 go get github.com/graphql-go/graphql 

рдмрд╕ рдПрдХ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд╕рд╛рде рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдореЗрдВ рдЬрд╛рдПрдВ


 cd examples/crud 

рдФрд░ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдЪрд▓рд╛рдПрдБ


 go run main.go 

рдЖрдк рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдкреНрд░рд╢реНрдиреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:
рдЖрдИрдбреА рджреНрд╡рд╛рд░рд╛ рдЙрддреНрдкрд╛рдж рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛
http://localhost:8080/product?query={product(id:1){name,info,price}}


рдЙрддреНрдкрд╛рджреЛрдВ рдХреА рдПрдХ рд╕реВрдЪреА рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛
http://localhost:8080/product?query={list{id,name,info,price}}


рдирдпрд╛ рдЙрддреНрдкрд╛рдж рдЬреЛрдбрд╝реЗрдВ
http://localhost:8080/product?query=mutation+_{create(name:"Tequila",info:"Strong alcoholic beverage",price:999){id,name,info,price}}


рдЙрддреНрдкрд╛рдж рд╕рдВрдкрд╛рджрди
http://localhost:8080/product?query=mutation+_{update(id:1,price:195){id,name,info,price}}


рдЖрдИрдбреА рджреНрд╡рд╛рд░рд╛ рдХрд┐рд╕реА рдЙрддреНрдкрд╛рдж рдХреЛ рдирд┐рдХрд╛рд▓рдирд╛
http://localhost:8080/product?query=mutation+_{delete(id:1){id,name,info,price}}


рдпрджрд┐ рдЖрдк REST рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рд╕рдВрднрд╡ рд╡рд┐рдХрд▓реНрдк рдХреЗ рд░реВрдк рдореЗрдВ GraphQL рдкрд░ рдзреНрдпрд╛рди рджреЗрдВред рд╣рд╛рдВ, рдкрд╣рд▓реА рдирдЬрд╝рд░ рдореЗрдВ рдпрд╣ рдЕрдзрд┐рдХ рдХрдард┐рди рд▓рдЧрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рд╢реБрд░реВ рдХрд░рдиреЗ рд▓рд╛рдпрдХ рд╣реИ рдФрд░ рдХреБрдЫ рджрд┐рдиреЛрдВ рдореЗрдВ рдЖрдк рдЗрд╕ рддрдХрдиреАрдХ рдореЗрдВ рдорд╣рд╛рд░рдд рд╣рд╛рд╕рд┐рд▓ рдХрд░ рд▓реЗрдВрдЧреЗред рдХрдо рд╕реЗ рдХрдо рдпрд╣ рдЙрдкрдпреЛрдЧреА рд╣реЛрдЧрд╛ред

Source: https://habr.com/ru/post/hi418203/


All Articles