この Topic では、Go の database/sql ライブラリが提供する API を使用して SQL ベースの LindormTable アプリケーションを開発する方法について説明し、例を示します。
前提条件
Go V1.17 以降がインストールされていること。Go のダウンロードとインストールの詳細については、「公式ドキュメント」をご参照ください。
LindormTable へのアクセスに使用するクライアントの IP アドレスが Lindorm ホワイトリスト に追加されていること。
制限事項
この Topic で説明する手順は、LindormTable Serverless には適用されません。
手順
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データベースドライバーへの依存関係を
.goファイルに追加します。次のコードブロックに例を示します:import ( avatica "github.com/apache/calcite-avatica-go/v5" ).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) // Configure the parameters related to the connection pool. 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。
テーブルの作成、テーブルへのデータ書き込み、データのクエリ、データの削除など、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) 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 オブジェクトを使用してデータを書き込んだりクエリしたりすることをお勧めします。この場合、同じ文がバッチで分析、書き換え、最適化されます。これにより、文のパフォーマンスが向上します。
完全なサンプルコードについては、「サンプルコード」および「パラメーターを指定したデータの書き込みとクエリ」をご参照ください。