This is an automated email from the ASF dual-hosted git repository.

brycemecum pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/arrow-adbc.git


The following commit(s) were added to refs/heads/main by this push:
     new 0489d944e docs: improve go docs by adding a readme (#3204)
0489d944e is described below

commit 0489d944ed495ff221e9cc215ffb7af302739407
Author: Bryce Mecum <[email protected]>
AuthorDate: Tue Aug 5 12:35:35 2025 -0700

    docs: improve go docs by adding a readme (#3204)
    
    Improves the existing go pkgsite by adding a README.
    
    This is an alternative to
    https://github.com/apache/arrow-adbc/pull/3199.
---
 go/adbc/README.md | 310 ++++++++++++++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 310 insertions(+)

diff --git a/go/adbc/README.md b/go/adbc/README.md
new file mode 100644
index 000000000..26902149f
--- /dev/null
+++ b/go/adbc/README.md
@@ -0,0 +1,310 @@
+<!---
+  Licensed to the Apache Software Foundation (ASF) under one
+  or more contributor license agreements.  See the NOTICE file
+  distributed with this work for additional information
+  regarding copyright ownership.  The ASF licenses this file
+  to you under the Apache License, Version 2.0 (the
+  "License"); you may not use this file except in compliance
+  with the License.  You may obtain a copy of the License at
+
+    http://www.apache.org/licenses/LICENSE-2.0
+
+  Unless required by applicable law or agreed to in writing,
+  software distributed under the License is distributed on an
+  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+  KIND, either express or implied.  See the License for the
+  specific language governing permissions and limitations
+  under the License.
+-->
+
+# adbc
+
+The `adbc` package provides Go interface definitions for using Arrow data and 
databases, also known as [ADBC](https://arrow.apache.org/adbc/).
+
+## Getting Started
+
+To give a brief tour of what you can do with the `adbc` package, we'll show a 
brief example of using the [SQLite 
driver](https://arrow.apache.org/adbc/current/driver/sqlite.html).
+
+### Installation
+
+First, assuming you've already created a Go module, add the `drivermgr` 
package to your `go.mod` by running:
+
+```sh
+go get github.com/apache/arrow-adbc/go/adbc/drivermgr
+```
+
+### Imports
+
+For imports, all we really need is 
`github.com/apache/arrow-adbc/go/adbc/drivermgr` to start but we'll import a 
few more modules now because we'll use them later.
+
+```go
+package main
+
+import (
+    "context"
+    "fmt"
+    "os"
+    "strings"
+
+    "github.com/apache/arrow-adbc/go/adbc"
+    "github.com/apache/arrow-adbc/go/adbc/drivermgr"
+    "github.com/apache/arrow-go/v18/arrow"
+    "github.com/apache/arrow-go/v18/arrow/array"
+    "github.com/apache/arrow-go/v18/arrow/memory"
+)
+
+func GettingStarted() error {
+    ctx := context.Background()
+
+```
+
+### Setup
+
+Any program using ADBC will start with creating a `Database`, a `Connection` 
to that `Database`, and usually one or more `Statement` objects.
+
+First we create a `Database`, providing `adbc_driver_sqlite` as the name of 
the driver to load:
+
+```go
+    var drv drivermgr.Driver
+    db, err := drv.NewDatabase(map[string]string{
+        "driver": "adbc_driver_sqlite",
+    })
+    if err != nil {
+        return err
+    }
+    defer db.Close()
+```
+
+Using the `Database` instance we created above, we can now create a 
`Connection` with `Open`:
+
+```go
+    conn, err := db.Open(ctx)
+    if err != nil {
+        return err
+    }
+    defer conn.Close()
+```
+
+Before we can execute any queries, we need to create a `Statement` to manage 
them:
+
+```go
+    stmt, err := conn.NewStatement()
+    if err != nil {
+        return err
+    }
+    defer stmt.Close()
+```
+
+Now that we have a basic setup, we'll show some of the functionality.
+
+### Executing a Query
+
+We can execute a query and get the results as Arrow data:
+
+```go
+    err = stmt.SetSqlQuery("SELECT 1, 2.0, 'Hello, world!'")
+    if err != nil {
+        return err
+    }
+
+    reader, n, err := stmt.ExecuteQuery(ctx)
+    if err != nil {
+        return err
+    }
+    defer reader.Release()
+    fmt.Println("Rows affected: ", n)
+
+    for reader.Next() {
+        record := reader.Record()
+
+        // Extract our three columns
+        col0 := record.Column(0)
+        col1 := record.Column(1)
+        col2 := record.Column(2)
+
+        for i := 0; i < int(record.NumRows()); i++ {
+            fmt.Printf("Row %d: %v, %v, %v\n", i,
+                col0.ValueStr(i), col1.ValueStr(i), col2.ValueStr(i))
+        }
+    }
+```
+
+This prints:
+
+```text
+Row 0: 1, 2, Hello, world!
+```
+
+### Parameterized Queries
+
+We can bind Arrow records as parameters in our queries too:
+
+```go
+    // Create parameter schema and data
+    paramSchema := arrow.NewSchema([]arrow.Field{
+        {Name: "param1", Type: arrow.PrimitiveTypes.Int64},
+    }, nil)
+
+    params, _, err := array.RecordFromJSON(memory.DefaultAllocator, 
paramSchema,
+        strings.NewReader(`[{"param1": 41}]`))
+    if err != nil {
+        return err
+    }
+    defer params.Release()
+
+    // Set query and bind parameters
+    err = stmt.SetSqlQuery("SELECT ? + 1 AS the_answer")
+    if err != nil {
+        return err
+    }
+
+    err = stmt.Prepare(ctx)
+    if err != nil {
+        return err
+    }
+
+    err = stmt.Bind(ctx, params)
+    if err != nil {
+        return err
+    }
+
+    reader2, _, err := stmt.ExecuteQuery(ctx)
+    if err != nil {
+        return err
+    }
+    defer reader2.Release()
+```
+
+### Ingesting Bulk Data
+
+You may have noticed that it took a number of steps to bind Arrow data to a 
query.
+
+New in `adbc` v1.7.0, IngestStream is a utility that simplifies the five-step 
boilerplate of `NewStatement`, `SetOption`, `Bind`, `Execute`, and `Close`.
+Note that IngestStream is not part of the [ADBC 
Standard](https://arrow.apache.org/adbc/current/format/specification.html).
+
+Here we can use it to create a table from Arrow data.
+First, let's prepare some data.
+
+```go
+    // Create Arrow table data
+    schema := arrow.NewSchema([]arrow.Field{
+        {Name: "ints", Type: arrow.PrimitiveTypes.Int64, Nullable: true},
+        {Name: "strs", Type: arrow.BinaryTypes.String, Nullable: true},
+    }, nil)
+
+    table, _, err := array.RecordFromJSON(memory.DefaultAllocator, schema,
+        strings.NewReader(`[{"ints": 1, "strs": "a"}, {"ints": 2, "strs": 
null}]`))
+    if err != nil {
+        return err
+    }
+    defer table.Release()
+
+    reader3, err := array.NewRecordReader(schema, []arrow.Record{table})
+    if err != nil {
+        return err
+    }
+    defer reader3.Release()
+```
+
+Now, we can use IngestStream:
+
+```go
+    // Ingest the data
+    count, err := adbc.IngestStream(ctx, conn, reader3, "sample",
+        adbc.OptionValueIngestModeCreateAppend, adbc.IngestStreamOptions{})
+    if err != nil {
+        return err
+    }
+    fmt.Printf("Ingested %d rows\n", count)
+```
+
+### Getting Database/Driver Metadata
+
+We can get information about the driver and the database:
+
+```go
+    // Get driver info
+    infoReader, err := conn.GetInfo(ctx, []adbc.InfoCode{
+        adbc.InfoVendorName,
+        adbc.InfoDriverName,
+    })
+    if err != nil {
+        return err
+    }
+    defer infoReader.Release()
+
+    // Process the info results...
+    for infoReader.Next() {
+        record := infoReader.Record()
+        // Extract vendor name, driver name, etc. from the record
+    }
+```
+
+We can also query for tables and columns in the database.
+
+Note: `GetObjects` takes an optional set of filters which control which 
objects are returned. We set them to `nil` here to return all objects.
+
+```go
+    objectsReader, err := conn.GetObjects(
+        ctx,
+        adbc.ObjectDepthAll,
+        nil, /* catalog *string */
+        nil, /* dbSchema *string */
+        nil, /* tableName *string */
+        nil, /* columnName *string */
+        nil,  /* tableType []string */
+    )
+    if err != nil {
+        return err
+    }
+    defer objectsReader.Release()
+
+    // Process the objects results to get catalog/schema/table information
+    for objectsReader.Next() {
+        record := objectsReader.Record()
+        // Navigate the nested structure for catalogs, schemas, tables, columns
+    }
+```
+
+We can get the Arrow schema of a table:
+
+```go
+    tableSchema, err := conn.GetTableSchema(ctx, nil, nil, "sample")
+    if err != nil {
+        return err
+    }
+
+    // tableSchema is an *arrow.Schema
+    fmt.Printf("Table schema: %s\n", tableSchema.String())
+```
+
+This prints:
+
+```text
+Table schema: schema:
+  fields: 2
+    - ints: type=int64, nullable
+    - strs: type=utf8, nullable
+```
+
+Finally, we close our GettingStarted, call it from `func main`, and handle any 
errors we returned:
+
+```go
+    return nil
+} // func GettingStarted
+
+func main() {
+   err := GettingStarted()
+
+    if err != nil {
+        fmt.Printf("Failed with error: %s", err)
+        os.Exit(1)
+    }
+}
+```
+
+If you would like to extract all the code above into a `.go` file, you can run,
+
+```sh
+awk '/```go/{flag=1;next}/```/{flag=0}flag' *.md > main.go
+```

Reply via email to