6.7 KiB
title | description | menu | influxdb3/cloud-serverless/tags | related | aliases | weight | ||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
Go Arrow Flight client | The Go Arrow Flight client integrates with Go scripts and applications to query data stored in InfluxDB. |
|
|
|
|
201 |
Apache Arrow for Go integrates with Go scripts and applications to query data stored in InfluxDB.
{{% note %}}
Use InfluxDB 3 client libraries
We recommend using the influxdb3-go
Go client library for integrating InfluxDB 3 with your Go application code.
InfluxDB 3 client libraries wrap Apache Arrow Flight clients and provide convenient methods for writing, querying, and processing data stored in {{% product-name %}}. Client libraries can query using SQL or InfluxQL. {{% /note %}}
Flight SQL client
Example query using Flight SQL
The following example shows how to use the Arrow Flight SQL client for Go to query an {{% product-name %}} bucket:
-
In your editor, open a new file named
query.go
and enter the following sample code:package main import ( "context" "crypto/x509" "encoding/json" "fmt" "os" "github.com/apache/arrow/go/v14/arrow/flight/flightsql" "google.golang.org/grpc" "google.golang.org/grpc/credentials" "google.golang.org/grpc/metadata" ) func dbQuery(ctx context.Context) error { url := "{{< influxdb/host >}}:443" // INFLUX_TOKEN is an environment variable you created for your API token token := os.Getenv("INFLUX_TOKEN") database := "get-started" // Create a gRPC transport pool, err := x509.SystemCertPool() if err != nil { return fmt.Errorf("x509: %s", err) } transport := grpc.WithTransportCredentials(credentials.NewClientTLSFromCert(pool, "")) opts := []grpc.DialOption{ transport, } // Create query client client, err := flightsql.NewClient(url, nil, nil, opts...) if err != nil { return fmt.Errorf("flightsql: %s", err) } ctx = metadata.AppendToOutgoingContext(ctx, "authorization", "Bearer "+token) ctx = metadata.AppendToOutgoingContext(ctx, "database", database) // Execute query query := `SELECT * FROM home WHERE time >= '2022-01-01T08:00:00Z' AND time <= '2022-01-01T20:00:00Z'` info, err := client.Execute(ctx, query) if err != nil { return fmt.Errorf("flightsql flight info: %s", err) } reader, err := client.DoGet(ctx, info.Endpoint[0].Ticket) if err != nil { return fmt.Errorf("flightsql do get: %s", err) } // Print results as JSON for reader.Next() { record := reader.Record() b, err := json.MarshalIndent(record, "", " ") if err != nil { return err } fmt.Println("RECORD BATCH") fmt.Println(string(b)) if err := reader.Err(); err != nil { return fmt.Errorf("flightsql reader: %s", err) } } return nil } func main() { if err := dbQuery(context.Background()); err != nil { fmt.Fprintf(os.Stderr, "error: %v\n", err) os.Exit(1) } }
The sample does the following:
-
Imports the following packages:
context
crypto/x509
encoding/json
fmt
os
github.com/apache/arrow/go/v14/arrow/flight/flightsql
google.golang.org/grpc
google.golang.org/grpc/credentials
google.golang.org/grpc/metadata
-
Creates a
dbQuery
function that does the following:-
Defines variables for InfluxDB credentials.
url
: {{% product-name %}} region hostname and port (:443
) (no protocol)database
: the name of the {{% product-name %}} bucket to querytoken
: an API token with read permission on the specified bucket. For security reasons, we recommend setting this as an environment variable rather than including the raw token string.
-
Defines an
opts
options list that includes a gRPC transport for communicating with InfluxDB over the gRPC+TLS protocol. -
Calls the
flightsql.NewClient()
method withurl
andopts
to create a new Flight SQL client. -
Appends the following InfluxDB credentials as key-value pairs to the outgoing context:
authorization
: Bearer <INFLUX_TOKEN>database
: Bucket name
-
Defines the SQL query to execute.
-
Calls the
client.execute()
method to send the query request. -
Calls the
client.doGet()
method with the ticket from the query response to retrieve result data from the endpoint. -
Creates a reader to read the Arrow table returned by the endpoint and print the results as JSON.
-
-
Creates a
main
module function that executes thedbQuery
function.
-
-
Enter the following commands to install all the necessary packages and run the program to query {{% product-name %}}:
go get ./... go run ./query.go
{{% influxdb/custom-timestamps %}} {{< expand-wrapper >}} {{% expand "View program output" %}}
RECORD BATCH
[
{
"co": 0,
"hum": 35.9,
"room": "Kitchen",
"temp": 21,
"time": "2022-01-01 08:00:00"
},
{
"co": 0,
"hum": 36.2,
"room": "Kitchen",
"temp": 23,
"time": "2022-01-01 09:00:00"
},
{
"co": 0,
"hum": 36.1,
"room": "Kitchen",
"temp": 22.7,
"time": "2022-01-01 10:00:00"
},
{
"co": 0,
"hum": 36,
"room": "Kitchen",
"temp": 22.4,
"time": "2022-01-01 11:00:00"
},
{
"co": 0,
"hum": 36,
"room": "Kitchen",
"temp": 22.5,
"time": "2022-01-01 12:00:00"
},
...
]
{{% /influxdb/custom-timestamps %}} {{% /expand %}} {{< /expand-wrapper >}}
For more information, see the Go Arrow Flight Client documentation.