---
title: Go Flight client
description: The Go Flight client integrates with Go scripts and applications to query data stored in InfluxDB.
url: https://docs.influxdata.com/influxdb3/clustered/reference/client-libraries/flight/go-flight/
estimated_tokens: 6767
product: InfluxDB Clustered
version: clustered
---

# Go Flight client

[Apache Arrow for Go](https://pkg.go.dev/github.com/apache/arrow/go/v12) integrates with Go scripts and applications to query data stored in InfluxDB.

#### Use InfluxDB 3 client libraries

We recommend using the [`influxdb3-go` Go client library](/influxdb3/clustered/reference/client-libraries/v3/go/) for integrating InfluxDB 3 with your Go application code.

[InfluxDB 3 client libraries](/influxdb3/clustered/reference/client-libraries/v3/) wrap Apache Arrow Flight clients and provide convenient methods for [writing](/influxdb3/clustered/get-started/write/#write-line-protocol-to-influxdb), [querying](/influxdb3/clustered/get-started/query/#execute-an-sql-query), and processing data stored in InfluxDB Clustered. Client libraries can query using SQL or InfluxQL.

## 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 InfluxDB Clustered database:

1. In your editor, open a new file named `query.go` and enter the following sample code:
    
    ```go
    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 := "cluster-host.com:443"
    
      // INFLUX_TOKEN is an environment variable you created for your database READ 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:
    
    1. 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`
    2. Creates a `dbQuery` function that does the following:
        
        1. Defines variables for InfluxDB credentials.
            
            -   **`url`**: InfluxDB cluster hostname and port (`:443`) *(no protocol)*
            -   **`database`**: the name of the InfluxDB Clustered database to query
            -   **`token`**: a [database token](/influxdb3/clustered/get-started/setup/#create-an-all-access-api-token) with read permission on the specified database. *For security reasons, we recommend setting this as an environment variable rather than including the raw token string.*
        2. Defines an `opts` options list that includes a gRPC transport for communicating with InfluxDB over the *gRPC+TLS* protocol.
            
        3. Calls the `flightsql.NewClient()` method with `url` and `opts` to create a new Flight SQL client.
            
        4. Appends the following InfluxDB credentials as key-value pairs to the outgoing context:
            
            -   **`authorization`**: Bearer <INFLUX\_TOKEN>
            -   **`database`**: Database name
        5. Defines the SQL query to execute.
            
        6. Calls the `client.execute()` method to send the query request.
            
        7. Calls the `client.doGet()` method with the *ticket* from the query response to retrieve result data from the endpoint.
            
        8. Creates a reader to read the Arrow table returned by the endpoint and print the results as JSON.
            
    3. Creates a `main` module function that executes the `dbQuery` function.
        
2. Enter the following commands to install all the necessary packages and run the program to query InfluxDB Clustered:
    
    ```sh
    go get ./...
    go run ./query.go
    ```
    

[](#view-program-output)

View program output

```text
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"
  },
  ...
]
```

For more information, see the [Go Arrow Flight Client documentation](https://pkg.go.dev/github.com/apache/arrow/go/v14/arrow/flight#Client).

#### Related

-   [Go client library for InfluxDB 3](/influxdb3/clustered/reference/client-libraries/v3/go/)

[Flight client](/influxdb3/clustered/tags/flight-client/) [Go](/influxdb3/clustered/tags/go/) [gRPC](/influxdb3/clustered/tags/grpc/) [SQL](/influxdb3/clustered/tags/sql/) [Flight SQL](/influxdb3/clustered/tags/flight-sql/) [client libraries](/influxdb3/clustered/tags/client-libraries/)
