本記事では、Go-SQL-Driver/MySQL ドライバと OceanBase データベースを使用して、テーブルの作成、データの挿入、クエリなどの基本的な操作を実現するアプリケーションの構築方法を紹介します。
前提条件
OceanBaseデータベース、Go言語、および関連ドライバーをインストールし、環境変数が正しく設定されていることを確認してください。
- OceanBaseデータベースのインストール
- Go言語のインストール
- Go-SQL-Driver/MySQLドライバーのインストール
手順
説明
本記事で示す操作手順は、Windows環境で生成されたものです。他のOS環境やコンパイラを使用している場合は、操作手順が若干異なる場合があります。
- (オプション)Go言語とドライバーをインストールします。
- OceanBaseデータベースの接続情報を取得します。
go-oceanbaseプロジェクトのデータベース接続情報を修正します。go-oceanbaseプロジェクトを実行します。
ステップ1:(オプション)Go言語とドライバーのインストール
Go言語とGo-SQL-Driver/MySQLドライバーが既にインストール済みの場合は、この手順をスキップしてください。インストールしていない場合は、以下の手順でインストールしてください。
Go言語のインストール
Go言語のインストーラーをダウンロードします:Go公式サイトから、ご使用のOSに適したインストーラーをダウンロードします。
説明
本記事で使用しているGoのインストーラーはgo1.20.6.windows-amd64.msiです。
Go言語のインストール:ダウンロードしたインストーラーをダブルクリックし、表示された指示に従ってインストールします。
環境変数の設定:Go言語のインストールパスをシステムのPATH環境変数に追加します。
Windows環境の場合、コントロールパネル > システムとセキュリティ > システム > 詳細なシステム設定 > 環境変数 > システム変数 でPathの値に
C:\usr\local\go\binを追加します。LinuxまたはmacOS環境の場合、
~/.bashrcまたは~/.bash_profileファイルを編集し、以下の内容を追加します:export PATH=$PATH:/usr/local/go/bin
説明
\usr\local\go\binはデフォルトのインストールディレクトリです。Go言語のインストール時にインストールディレクトリを変更した場合は、対応するディレクトリに置き換えてください。インストールの確認:Shellコマンドラインで以下のコマンドを入力し、Go言語のバージョン情報を確認して、インストールが成功したかどうかを確認します:
C:\Users\admin\> go version go version go1.20.6 windows/amd64
Go-SQL-Driver/MySQLドライバーのインストール
Go言語のバージョンに応じて、異なるインストール方法を選択できます。Go-SQL-Driver/MySQLドライバーをインストールする際は、対応するプロジェクトディレクトリに移動してコマンドラインターミナルを開く必要があります。
Go-SQL-Driver/MySQLの詳細については、Githubを参照してください。インストールコマンドは以下のとおりです:
C:\Users\admin\Desktop\go-oceanbase>go get -u github.com/go-sql-driver/mysql go: downloading github.com/go-sql-driver/mysql v1.7.1 go: added github.com/go-sql-driver/mysql v1.7.1バージョンやネットワークの問題で
go getコマンドによるインストールができない場合は、go installコマンドでgo-sql-driver/mysqlをインストールできます。go/srcディレクトリで、github上のgo-sql-driver/mysqlリポジトリをクローンします。cd /usr/local/go/src git clone https://github.com/go-sql-driver/mysql.git注意
/usr/local/go/srcは、Goが実際にインストールされているディレクトリに置き換えて操作してください。go installでインストールします。go install mysql注意
一部のバージョンでは、
go installのデフォルトの実行ディレクトリが/srcではない場合があります。go install実行後のエラーから実際のディレクトリを判断できます。例えば、cannot find package "mysql" in: /usr/local/go/src/vendor/mysqlエラーが発生した場合は、mysqlフォルダを/src/vendorディレクトリに配置してからインストールコマンドを再度実行してください。Go-SQL-Driver/MySQLドライバーがインストールされているか確認します。インストールに失敗した場合は、エラーメッセージに従って修正してください。
go list -m github.com/go-sql-driver/mysql
ステップ2:OceanBaseデータベースの接続情報を取得する
OceanBaseデータベースのデプロイ担当者または管理者から、該当するデータベース接続文字列を取得します。
obclient -h{host} -u{username} -p****** -P{port} -D{schema_name}
データベース接続文字列には、データベースへのアクセスに必要なパラメータ情報が含まれています。この接続文字列を使用してデータベースへのログインを検証し、パラメータ情報が正しいことを確認できます。
説明
test.go ファイルには、このURL情報が必要です。
パラメータの説明:
host:OceanBaseデータベースの接続IPアドレス。ODP接続方式ではODPアドレスを使用し、直接接続方式ではOBServerノードのIPアドレスを使用します。user_name:テナントの接続アカウント。ODP接続の一般的な形式はユーザー名@テナント名#クラスタ名またはクラスタ名:テナント名:ユーザー名です。直接接続方式の形式はユーザー名@テナント名です。password:アカウントのパスワード。port:OceanBaseデータベースの接続ポート。ODP接続方式のデフォルトポートは2883で、ODPデプロイ時にカスタマイズ可能です。直接接続方式のデフォルトポートは2881で、OceanBaseデータベースのデプロイ時にカスタマイズ可能です。schema_name:アクセスするSchema名。
ステップ3:go-oceanbase プロジェクトのデータベース接続情報を修正する
ステップ2:OceanBaseデータベースの接続情報を取得する の情報に基づいて、test.go ファイル内のデータベース接続情報を修正します。test.go ファイルを選択し、右クリックして 開く方法 を選択すると、メモ帳 などのエディタで開くことができます。
例:
- OBServerノードのIPアドレスは
10.10.10.1です。 - アクセスポートは2881を使用します。
- アクセスするSchema名は
testです。 - テナントの接続アカウントは
root@mysqlです。root@mysqlはOceanBaseデータベースで作成されたMySQLモードのユーザーテナントであり、testはテナントroot@mysqlのユーザー名です。 - パスワードは
******です。
サンプルコード:
conn := "root@mysql:******@tcp(10.10.10.1:2881)/test"
ステップ4:go-oceanbase プロジェクトを実行する
コードの編集が完了したら、プロジェクトディレクトリでコマンドラインターミナルを開き、go run コマンドでGoファイルを直接実行します。
C:\Users\admin\Desktop\go-oceanbase>go run test.go
(オプション)LinuxまたはmacOS環境では、一時的な環境変数を設定してからでないと go run を実行できません。
export PATH=$PATH:/usr/local/go/bin
go run test.go
実行後、以下の内容が返された場合、データベースへの接続が成功し、サンプルステートメントが正しく実行されたことを意味します。
説明
この内容は、「テーブルt1の削除」を実行した後の結果をマスクしたものです。
C:\Users\admin\Desktop\go-oceanbase>go run test.go
success to connect OceanBase with go_mysql driver
Hello OceanBase
プロジェクトコードについて
go-oceanbase をクリックしてプロジェクトコードをダウンロードします。go-oceanbase という名前の圧縮ファイルです。
解凍すると、go-oceanbase という名前のフォルダが作成されます。ディレクトリ構造は以下のとおりです:
|-- go.mod
|-- go.sum
|-- test.go
ファイルの説明:
go.mod:Go言語のモジュールファイルで、プロジェクトのモジュール依存関係とバージョン情報を定義します。go.sum:Go V1.11以降で追加されたモジュール管理ファイルで、プロジェクトの依存モジュールとそのバージョン情報、および対応するチェックサム(Checksum)を記録します。test.go:Goのソースコードファイルで、プロジェクトのサンプルコードが含まれています。
go.modコードの紹介
go.mod ファイルは、プロジェクトのモジュール名、Goのバージョン番号、および依存関係の宣言を定義するために使用されます。
go.mod ファイルには以下の内容が含まれています:
module go-oceanbase:これはプロジェクトのモジュール名であり、プロジェクトの名前空間を定義します。Go 1.16以降では、モジュール名はプロジェクトのルートディレクトリ名と一致している必要があります。go 1.20:これはプロジェクトに必要なGoのバージョンです。require github.com/go-sql-driver/mysql v1.7.1 // indirect:これはプロジェクトの依存関係宣言です。プロジェクトが必要とするgithub.com/go-sql-driver/mysqlモジュールのバージョンをV1.7.1と指定し、この依存関係が間接的な依存関係であり、別の依存関係go.sumに関連付けられていることを示しています。
go.sumコードの紹介
go.sum ファイルは、github.com/go-sql-driver/mysql 依存関係のバージョン情報を定義するために使用され、プロジェクトが正しい依存関係バージョンを使用することを保証します。
go.sum ファイルには以下の内容が含まれています:
github.com/go-sql-driver/mysql v1.7.1 h1:lUIinVbN1DY0xBg0eMOzmmtGoHwWBbvnWubQUrtU8EI=モジュールのソースコードファイルのハッシュ値であり、プロジェクトのビルド時に正しいバージョンが使用されることを保証します。ここでのハッシュ値はlUIinVbN1DY0xBg0eMOzmmtGoHwWBbvnWubQUrtU8EI=です。github.com/go-sql-driver/mysql v1.7.1/go.mod h1:OXbVy3sEdcQ2Doequ6Z5BW6fXNQTmx+9S1MCJN5yJMI=モジュールの依存関係ファイルのハッシュ値であり、プロジェクトのビルド時に正しい依存関係バージョンが使用されることを保証します。ここでのハッシュ値はOXbVy3sEdcQ2Doequ6Z5BW6fXNQTmx+9S1MCJN5yJMI=です。
test.goコードの紹介
test.go ファイルは、Go言語とOceanBaseデータベースのMySQLモードを使用してやり取りする方法を定義しています。これには、データベースへの接続、テーブルの作成、データの挿入、データのクエリ、テーブルの削除などの操作が含まれます。 test.go ファイルには以下の内容が含まれています:
mainパッケージを定義します。package mainは、実行可能プログラムのパッケージであることを示しています。このパッケージにはmain()関数が含まれており、プログラムの実行時にこの関数が実行されます。importパッケージを定義します。importステートメントは、以下の4つのパッケージをインポートしています:database/sql:汎用的なSQLデータベースアクセスインターフェースを提供します。これは、さまざまなタイプのSQLデータベースへの接続と操作を行うための汎用インターフェースと関数のセットを定義しています。fmt:フォーマットされた入力と出力の関数を提供します。これは、データを文字列にフォーマットしてコンソールやその他のデバイスに出力するための一連の関数を定義しています。log:ログ記録の関数を提供します。これは、ログ情報をコンソールやその他のデバイスに出力するための一連の関数を定義しています。github.com/go-sql-driver/mysql:MySQLモードのドライバーを提供します。これはdatabase/sqlパッケージで定義されたインターフェースを実装しており、Go言語でMySQLモードに接続し操作するために使用されます。ここでは、正しいgo-sql-driver/mysqlのインストールパスを指定する必要があります。
コード:
import ( "database/sql" "fmt" "log" _ "github.com/go-sql-driver/mysql" // go-sql-driver/mysqlのインストールパスを入力してください。 )Str構造体を定義します。 フィールドNameを含み、クエリ結果を格納するために使用されます。main()関数を定義し、その中にselectAll()関数を含みます。このselectAll()関数は、テーブルの作成、データの挿入、データのクエリ、テーブルの削除などの操作を完了するために使用されます。コード:
type Str struct { Name string } func main() { selectAll() }selectAll()関数を定義します。selectAll()関数には、データベースへの接続、テーブルの作成、データの挿入、データのクエリ、テーブルの削除などの操作が含まれます。データベースに接続します。 接続文字列
connを定義します。これには、ユーザー名、パスワード、IPアドレス、ポート番号、データベース名などのMySQLモードの接続パラメータが含まれます。sql.Open()関数を呼び出してデータベース接続を開き、エラーが発生した場合はログを記録してプログラムを終了します。deferキーワードを使用してデータベース接続のクローズを遅延させ、関数の終了時に接続が閉じられるようにします。コード:
conn := "user_name:******@tcp(host:port)/schema_name" // データベース接続パラメータ db, err := sql.Open("mysql", conn) if err != nil { log.Fatal(err) }コンソールにメッセージを出力します。
deferキーワードを使用してdb.Close()関数の実行を遅延させ、関数の終了時にデータベース接続が閉じられるようにします。fmt.Printf()関数を使用して、接続成功のメッセージをコンソールに出力します。コード:
defer db.Close() if err != nil { log.Fatal(err) } fmt.Printf("success to connect OceanBase with go_mysql driver\n")データを作成します。
t1という名前のテーブルを作成し、文字列型のフィールドstrを設定します。長さは256です。コード:
_, err = db.Query("create table t1(str varchar(256))") if err != nil { log.Fatal(err) }データを挿入します。 テーブル
t1に1行のデータを挿入し、その行のデータのstrフィールドの値をHello OceanBaseに設定します。コード:
_, err = db.Query("insert into t1 values ('Hello OceanBase')") if err != nil { log.Fatal(err) }データをクエリします。 テーブル
t1のすべてのデータをクエリし、クエリ結果を変数resに代入します。クエリに失敗した場合は、エラーメッセージを返します。コード:
res, err := db.Query("SELECT * FROM t1") if err != nil { log.Fatal(err) } defer res.Close() for res.Next() { var str Str res.Scan(&str.Name) fmt.Printf("%s\n", str.Name) }データを削除します。 テーブル
t1を削除します。削除に失敗した場合は、エラーメッセージを返します。コード:
_, err = db.Query("drop table t1") if err != nil { log.Fatal(err) }
全コード表示
module go-oceanbase
go 1.20
require github.com/go-sql-driver/mysql v1.7.1 // indirect
github.com/go-sql-driver/mysql v1.7.1 h1:lUIinVbN1DY0xBg0eMOzmmtGoHwWBbvnWubQUrtU8EI=
github.com/go-sql-driver/mysql v1.7.1/go.mod h1:OXbVy3sEdcQ2Doequ6Z5BW6fXNQTmx+9S1MCJN5yJMI=
package main
import (
"database/sql"
"fmt"
"log"
_ "github.com/go-sql-driver/mysql"
// go-sql-driver/mysqlのインストールパスを入力してください。
)
type Str struct {
Name string
}
func main() {
selectAll()
}
func selectAll() {
conn := "user_name:******@tcp(host:port)/schema_name"
// データベース接続パラメータ
db, err := sql.Open("mysql", conn)
if err != nil {
log.Fatal(err)
}
defer db.Close()
if err != nil {
log.Fatal(err)
}
fmt.Printf("success to connect OceanBase with go_mysql driver\n")
// テーブルt1を作成
_, err = db.Query("create table t1(str varchar(256))")
if err != nil {
log.Fatal(err)
}
// データを挿入
_, err = db.Query("insert into t1 values ('Hello OceanBase')")
if err != nil {
log.Fatal(err)
}
// データをクエリ
res, err := db.Query("SELECT * FROM t1")
if err != nil {
log.Fatal(err)
}
defer res.Close()
for res.Next() {
var str Str
res.Scan(&str.Name)
fmt.Printf("%s\n", str.Name)
}
// テーブルt1を削除
_, err = db.Query("drop table t1")
if err != nil {
log.Fatal(err)
}
}
関連ドキュメント
Go-SQL-Driver/MySQLに関する情報は、OceanBaseデータベースのオープンソースコミュニティにも多数あります。詳細については、Go-SQL-Driver/MySQLを参照してください。
go-oceanbase サンプルプロジェクトをダウンロード