すべてのプロダクト
Search
ドキュメントセンター

Lindorm:Go の database/sql ライブラリが提供する API を使用してアプリケーションを開発する

最終更新日:Mar 21, 2025

このトピックでは、Go の database/sql ライブラリが提供する API を使用して SQL ベースの LindormTable アプリケーションを開発する方法について説明し、例を示します。

前提条件

  • Go V1.17 以降がインストールされていること。 Go のダウンロードとインストール方法の詳細については、公式ドキュメントをご参照ください。

  • LindormTable にアクセスするために使用するクライアントの IP アドレスが、Lindorm インスタンスのホワイトリストに追加されていること。 詳細については、ホワイトリストの設定をご参照ください。

制限事項

このトピックで説明する手順は、LindormTable Serverless には適用されません。

手順

  1. Go プロジェクトの go.mod ファイルに次の依存関係を追加します。

    require github.com/apache/calcite-avatica-go/v5 v5.0.0
    replace github.com/apache/calcite-avatica-go/v5 => github.com/aliyun/alibabacloud-lindorm-go-sql-driver/v5 v5.0.6
  2. .go ファイルにデータベースドライバーへの依存関係を追加します。 次のコードブロックは例を示しています。

    import (
        avatica "github.com/apache/calcite-avatica-go/v5"
    )
  3. .go ファイルの main メソッドで接続プールを初期化し、関連パラメータを設定します。 次のコードは例を示しています。

    databaseUrl := "http://localhost:30060" 
    
    conn := avatica.NewConnector(databaseUrl).(*avatica.Connector)
    conn.Info = map[string]string{
        "user":     "sql",     // ユーザー名
        "password": "test",   // パスワード
        "database": "default", // データベース名
    }
    db := sql.OpenDB(conn)
    // 接続プールに関連するパラメータを設定します。
    db.SetConnMaxIdleTime(8 * time.Minute)
    db.SetMaxOpenConns(20)
    db.SetMaxIdleConns(2)

    次の表に、接続プールに設定できるパラメータを示します。

    パラメータ

    必須

    説明

    databaseUrl

    はい

    LindormTable SQL に接続するために使用するエンドポイント。 例:http://ld-bp12pc23yfb38****-proxy-lindorm.lindorm.rds.aliyuncs.com:30060。 エンドポイントの取得方法の詳細については、LindormTable のエンドポイントの表示をご参照ください。

    user

    はい

    LindormTable に接続するために使用するユーザー名。

    password

    はい

    LindormTable に接続するために使用するパスワード。 パスワードを忘れた場合は、LindormTable のクラスタ管理システムでパスワードを変更できます。 詳細については、ユーザーのパスワードの変更をご参照ください。

    database

    はい

    アクセスするデータベースの名前。

    SetConnMaxIdleTime

    いいえ

    接続の最大アイドル時間。 デフォルト値:0。 デフォルト値は、LindormTable への接続がタイムアウトしないことを示します。

    SetMaxOpenConns

    いいえ

    接続プール内の最大接続数。 デフォルト値:0。 デフォルト値は、接続プール内の接続数が制限されないことを示します。

    SetMaxIdleConns

    いいえ

    接続プール内の最大アイドル接続数。 デフォルト値:2。

  4. LindormTable で、テーブルの作成、テーブルへのデータの書き込み、データのクエリ、データの削除などの操作を実行します。 次の例は、LindormTable で操作を実行する方法を示しています。

    • テーブルを作成します。

      _, err := db.Exec("create table if not exists user_test(id int, name varchar,age int, primary key(id))")
      if err != nil {
          fmt.Println("create table error ", err) // テーブル作成エラー
          return
      }
    • テーブルにデータを書き込みます。

      • 方法 1:テーブルに直接データを書き込みます。

        _, err = db.Exec("upsert into user_test(id,name,age) values(1,'zhangsan',17)")
        if err != nil {
            fmt.Println("insert data error", err) // データ挿入エラー
            return
        }
      • 方法 2:パラメータを指定してテーブルにデータを書き込みます。

        stmt, err := db.Prepare("upsert into user_test(id,name,age) values(?,?,?)")
        if err != nil {
            fmt.Println("prepare error", err) // 準備エラー
            return
        }
        _, err = stmt.Exec(1, "zhangsan", 17)
        if err != nil {
            fmt.Println("upsert error", err) // upsert エラー
            return
        }
    • データをクエリします。

      • 方法 1:データを直接クエリします。

        rows, err := db.Query("select * from user_test")
        if err != nil {
            fmt.Println("query data error", err) // データクエリ エラー
            return
        }
        defer rows.Close()
        var id int
        var name string
        var age int
        for rows.Next() {
            err = rows.Scan(&id, &name, &age)
            if err != nil {
                   fmt.Println("scan data error", err) // データスキャン エラー
                return
            }
            fmt.Println("id:", id, "name:", name, "age:", age)
        }
      • 方法 2:パラメータを指定してデータをクエリします。

        stmt, err = db.Prepare("select * from user_test where id=?")
        if err != nil {
            fmt.Println("prepare error", err) // 準備エラー
            return
        }
        rows, err := stmt.Query(1)
        if err != nil {
            fmt.Println("query data error", err) // データクエリ エラー
            return
        }
        defer rows.Close()
        var id int
        var name string
        var age int
        for rows.Next() {
            err = rows.Scan(&id, &name, &age)
            if err != nil {
                   fmt.Println("scan data error", err) // データスキャン エラー
                return
            }
            fmt.Println("id:", id, "name:", name, "age:", age)
        }
    • データを削除します。

      _, err = db.Exec("delete from user_test where id=1")
      if err != nil {
          fmt.Println("delete data error", err) // データ削除エラー
          return
      }
    説明
    • 同様のステートメントを実行してデータの書き込みまたはクエリを行うビジネスシナリオでは、Prepare メソッドによって初期化された stmt オブジェクトを使用してデータの書き込みまたはクエリを行うことをお勧めします。 この場合、同じステートメントがバッチで分析、書き換え、および最適化されます。 これにより、ステートメントのパフォーマンスが向上します。

    • 完全なサンプルコードについては、サンプルコードパラメータを指定してデータの書き込みとクエリを行うをご覧ください。