このトピックでは、Go の database/sql ライブラリが提供する API を使用して SQL ベースの LindormTable アプリケーションを開発する方法について説明し、例を示します。
前提条件
Go V1.17 以降がインストールされていること。 Go のダウンロードとインストール方法の詳細については、公式ドキュメントをご参照ください。
LindormTable にアクセスするために使用するクライアントの IP アドレスが、Lindorm インスタンスのホワイトリストに追加されていること。 詳細については、ホワイトリストの設定をご参照ください。
制限事項
このトピックで説明する手順は、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) // 接続プールに関連するパラメータを設定します。 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) // 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 オブジェクトを使用してデータの書き込みまたはクエリを行うことをお勧めします。 この場合、同じステートメントがバッチで分析、書き換え、および最適化されます。 これにより、ステートメントのパフォーマンスが向上します。
完全なサンプルコードについては、サンプルコードとパラメータを指定してデータの書き込みとクエリを行うをご覧ください。