Go
The current Go client version is v4.8.1
.
Installation and setupโ
To get the latest stable version of the Go client library, run the following:
go get github.com/weaviate/weaviate-go-client/v4
This API client is compatible with Go 1.16+.
You can use the client in your Go scripts as follows:
package main
import (
"context"
"fmt"
"github.com/weaviate/weaviate-go-client/v4/weaviate"
)
func GetSchema() {
cfg := weaviate.Config{
Host: "localhost:8080",
Scheme: "http",
}
client, err := weaviate.NewClient(cfg)
if err != nil {
panic(err)
}
schema, err := client.Schema().Getter().Do(context.Background())
if err != nil {
panic(err)
}
fmt.Printf("%v", schema)
}
Authenticationโ
For more comprehensive information on configuring authentication with Weaviate, refer to the authentication page.
The Go client offers multiple options for authenticating against Weaviate, including multiple OIDC authentication flows.
The suitable authentication options and methods for the client largely depend on the specific configuration of the Weaviate instance.
WCS authenticationโ
Each Weaviate instance in Weaviate Cloud Services (WCS) is pre-configured to act as a token issuer for OIDC authentication.
See our WCS authentication documentation for instructions on how to authenticate against WCS with your preferred Weaviate client.
API key authenticationโ
4.7.0
and higher.To authenticate against Weaviate using an API key, instantiate the client as follows:
cfg := weaviate.Config{
Host: "weaviate.example.com",
Scheme: "http",
AuthConfig: auth.ApiKey{Value: "my-secret-key"},
Headers: nil,
}
client, err := weaviate.NewClient(cfg)
if err != nil{
fmt.Println(err)
}
OIDC authenticationโ
To authenticate against Weaviate with OIDC, you must select a flow made available by the identity provider and create the flow-specific authentication configuration.
This configuration will then be used by the Weaviate client to authenticate. The configuration includes secrets that help the client obtain an access token
and, if configured, a refresh token
.
The access token
is added to the HTTP header of each request and is utilized for authentication with Weaviate. Typically, this token has a limited lifespan, and the refresh token
can be employed to obtain a new set of tokens when necessary.
Resource Owner Password Flowโ
This OIDC flow uses the username and password to obtain required tokens for authentication.
Note that not every provider automatically includes a refresh token
and an appropriate scope might be required that depends on your identity provider. The client uses offline_access as the default scope. This works with some providers, but as it depends on the configuration of the identity providers, we ask you to refer to the identity provider's documentation.
Without a refresh token, there is no possibility to acquire a new access token
and the client becomes unauthenticated after expiration.
The Weaviate client does not save the username or password used.
They are only used to obtain the first tokens, after which existing tokens will be used to obtain subsequent tokens if possible.
cfg := weaviate.Config{
Host: "weaviate.example.com",
Scheme: "http",
AuthConfig: auth.ResourceOwnerPasswordFlow{
Username: "Your user",
Password: "Your password",
Scopes: []string{"offline_access"}, // optional, depends on the configuration of your identity provider (not required with WCS)
},
Headers: nil,
}
client, err := weaviate.NewClient(cfg)
if err != nil{
fmt.Println(err)
}
Client Credentials flowโ
This OIDC flow uses a client secret
to obtain required tokens for authentication.
This flow is recommended for server-to-server communication without end-users and authenticates an application to Weaviate. This authentication flow is typically regarded as more secure than the resource owner password flow: a compromised client secret can be simply revoked, whereas a compromised password may have larger implications beyond the scope of breached authentication.
To authenticate a client secret most identity providers require a scope to be specified. This scope depends on the configuration of the identity providers, so we ask you to refer to the identity provider's documentation.
Most providers do not include a refresh token in their response so client secret
is saved in the client to obtain a new access token
on expiration of the existing one.
cfg := weaviate.Config{
Host: "weaviate.example.com",
Scheme: "http",
AuthConfig: auth.ClientCredentials{
ClientSecret: "your_client_secret",
Scopes: []string{"scope1 scope2"}, // optional, depends on the configuration of your identity provider (not required with WCS)
},
Headers: nil,
}
client, err := weaviate.NewClient(cfg)
if err != nil{
fmt.Println(err)
}
Refresh Token flowโ
Any other OIDC authentication method can be used to obtain tokens directly from your identity provider, for example by using this step-by-step guide of the hybrid flow.
If no refresh token
is provided, there is no possibility to obtain a new access token
and the client becomes unauthenticated after expiration.
cfg := weaviate.Config{
Host: "weaviate.example.com",
Scheme: "http",
AuthConfig: auth.BearerToken{
AccessToken: "some token",
RefreshToken: "other token",
ExpiresIn: uint(500), // in seconds
},
Headers: nil,
}
client, err := weaviate.NewClient(cfg)
if err != nil{
fmt.Println(err)
}
Custom headersโ
You can pass custom headers to the client, which are added at initialization:
cfg := weaviate.Config{
Host:"weaviate.example.com",
Scheme: "http",
AuthConfig: nil,
Headers: map[string]string{
"header_key1": "value",
"header_key2": "otherValue",
},
}
client, err := weaviate.NewClient(cfg)
if err != nil{
fmt.Println(err)
}
Referencesโ
All RESTful endpoints and GraphQL functions references covered by the Go client, and explained on those reference pages in the code blocks.
Designโ
Builder patternโ
The Go client functions are designed with a 'Builder pattern'. A pattern is used to build complex query objects. This means that a function (for example to retrieve data from Weaviate with a request similar to a RESTful GET request, or a more complex GraphQL query) is built with single objects to reduce complexity. Some builder objects are optional, others are required to perform specific functions. All is documented on the RESTful API reference pages and the GraphQL reference pages.
The code snippet above shows a simple query similar to RESTful GET /v1/schema
. The client is initiated by requiring the package and connecting to the running instance. Then, a query is constructed by getting the .Schema
with .Getter()
. The query will be sent with the .Go()
function, this object is thus required for every function you want to build and execute.
Migration Guidesโ
From v2
to v4
โ
Unnecessary .Objects()
removed from GraphQL.Get()
โ
Before:
client.GraphQL().Get().Objects().WithClassName...
After:
client.GraphQL().Get().WithClassName
GraphQL Get().WithNearVector()
uses a builder patternโ
In v2
specifying a nearVector
argument to client.GraphQL().Get()
required passing a string. As a result the user had to know the structure of the GraphQL API. v4
fixes this by using a builder pattern like so:
Before:
client.GraphQL().Get().
WithNearVector("{vector: [0.1, -0.2, 0.3]}")...
After
nearVector := client.GraphQL().NearVectorArgBuilder().
WithVector([]float32{0.1, -0.2, 0.3})
client.GraphQL().Get().
WithNearVector(nearVector)...
All where
filters use the same builderโ
In v2
filters were sometimes specified as strings, sometimes in a structured way. v4
unifies this and makes sure that you can always use the same builder pattern.
GraphQL Getโ
Before:
// using filter encoded as string
where := `where :{
operator: Equal
path: ["id"]
valueString: "5b6a08ba-1d46-43aa-89cc-8b070790c6f2"
}`
client.GraphQL().Get().
Objects().
WithWhere(where)...
// using deprecated graphql arg builder
where := client.GraphQL().WhereArgBuilder().
WithOperator(graphql.Equal).
WithPath([]string{"id"}).
WithValueString("5b6a08ba-1d46-43aa-89cc-8b070790c6f2")
client.GraphQL().Get().
Objects().
WithWhere(where)...
After:
where := filters.Where().
WithPath([]string{"id"}).
WithOperator(filters.Equal).
WithValueString("5b6a08ba-1d46-43aa-89cc-8b070790c6f2")
client.GraphQL().Get().
WithWhere(where)...
GraphQL Aggregateโ
Before:
where := client.GraphQL().WhereArgBuilder().
WithPath([]string{"id"}).
WithOperator(graphql.Equal).
WithValueString("5b6a08ba-1d46-43aa-89cc-8b070790c6f2")
client.GraphQL().Aggregate().
Objects().
WithWhere(where)...
After:
where := filters.Where().
WithPath([]string{"id"}).
WithOperator(filters.Equal).
WithValueString("5b6a08ba-1d46-43aa-89cc-8b070790c6f2")
client.GraphQL().Aggregate().
WithWhere(where)...
Classificationโ
Before:
valueInt := 100
valueString := "Government"
sourceWhere := &models.WhereFilter{
ValueInt: &valueInt,
Operator: string(graphql.GreaterThan),
Path: []string{"wordCount"},
}
targetWhere := &models.WhereFilter{
ValueString: &valueString,
Operator: string(graphql.NotEqual),
Path: []string{"name"},
}
client.Classifications().Scheduler().
WithSourceWhereFilter(sourceWhere).
WithTargetWhereFilter(targetWhere)...
After:
sourceWhere := filters.Where().
WithOperator(filters.GreaterThan).
WithPath([]string{"wordCount"}).
WithValueInt(100)
targetWhere := filters.Where().
WithOperator(filters.NotEqual).
WithPath([]string{"name"}).
WithValueString("Government")
client.Classifications().Scheduler().
WithSourceWhereFilter(sourceWhere).
WithTargetWhereFilter(targetWhere)...
GraphQL Get().WithFields()
โ
In v2
.WithFields()
took a GraphQL string that required knowledge of how GraphQL fields are structured. Now this can be done with a variadic function. E.g:
Before:
client.GraphQL.Get().WithClassName("MyClass").WithFields("name price age")...
After:
client.GraphQL.Get().WithClassName("MyClass").
WithFields(graphql.Field{Name: "name"},graphql.Field{Name: "price"}, graphql.Field{Name: "age"})...
Graphql Get().WithGroup()
โ
In v2
.WithFields()
took a GraphQL string that required knowledge of how GraphQL fields are structured. Now this can be done with a builder. E.g:
Before:
client.GraphQL.Get().WithClassName("MyClass")
.WithGroup("{type:merge force:1.0}")
After:
group := client.GraphQL().GroupArgBuilder()
.WithType(graphql.Merge).WithForce(1.0)
client.GraphQL.Get().WithClassName("MyClass").WithGroup(group)
Graphql Data().Validator()
property renamedโ
In v2
the naming of the method to specify the Schema was inconsistent with other places in the client. This has been fixed in v4
. Rename according to the following:
Before:
client.Data().Validator().WithSchema(properties)
After:
client.Data().Validator().WithProperties(properties)
Change logsโ
Check the change logs on GitHub for updates on the latest Go client
changes.
More Resourcesโ
If you can't find the answer to your question here, please look at the:
- Frequently Asked Questions. Or,
- Knowledge base of old issues. Or,
- For questions: Stackoverflow. Or,
- For more involved discussion: Weaviate Community Forum. Or,
- We also have a Slack channel.