本記事では、GORMとOceanBaseデータベースを使用してアプリケーションを構築し、テーブルの作成、データの挿入、クエリなどの基本的な操作を実行する方法を紹介します。
前提条件
OceanBaseデータベース、Go言語、および関連するドライバーをインストールし、環境変数が正しく設定されていること。
説明
この記事のコードはIntelliJ IDEA 2021.3.2(Community Edition)バージョンを使用して記述されています。ご自身の好みに合わせて、適切なツールを選択してサンプルコードを確認することも可能です。
- OceanBaseデータベースがインストールされていること
- Go言語がインストールされていること
- Go-SQL-Driver/MySQLドライバーがインストールされていること
操作手順
説明
本記事で示されている操作手順は、Windows環境で生成されたものです。他のOS環境やコンパイラを使用している場合は、操作手順が若干異なる場合があります。
- (オプション)Go言語とドライバーをインストールします。
- OceanBaseデータベースへの接続情報を取得します。
gorm-oceanbaseプロジェクトのデータベース接続情報を修正します。gorm-oceanbaseプロジェクトを実行します。
ステップ1:(オプション)Go言語とドライバーをインストールする
Go言語とGo-SQL-Driver/MySQLドライバーがインストール済みの場合は、この手順はスキップできます。インストールされていない場合は、以下の手順に従ってインストールすることができます。
Go言語をインストールする
Go言語のインストールパッケージをダウンロードします:Go公式Webサイト から、ご自身の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をインストールできます。githubの
go-sql-driver/mysqlリポジトリをgo/srcディレクトリにクローンします。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{user_name} -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:アクセスするスキーマ名です。
ステップ3: gorm-oceanbase プロジェクトのデータベース接続情報を修正する
ステップ2:OceanBaseデータベース接続情報を取得する に記載されている情報に基づいて、test.go ファイル内のデータベース接続情報を修正します。test.go ファイルを選択し、右クリックして 開く方法 を選択すると、メモ帳 またはその他のエディタで開くことができます。

例:
- OBServerノードのIPアドレスは
10.10.10.1です。 - アクセスポートは2881を使用します。
- アクセスするスキーマ名は
testです。 - テナントの接続アカウントは
root@mysqlです。root@mysqlはOceanBaseデータベースで作成されたMySQLモデルのユーザーテナントであり、testはテナントroot@mysqlのユーザー名です。 - パスワードは
******です。
サンプルコードは以下のとおりです:
dsn := "root@mysql:******@tcp(10.10.10.1:2881)/test?charset=utf8mb4&parseTime=True&loc=Local"
ステップ4:go-oceanbase プロジェクトを実行する
コードの編集が完了したら、プロジェクトディレクトリでコマンドラインターミナルを開き、go run でGoファイルを以下のとおり実行します:
PS D:\demo\go-demo\gorm-oceanbase> go run test.go
(オプション)LinuxまたはmacOS環境では、一時的な環境変数を設定してからでないと go run を実行できません。
export PATH=$PATH:/usr/local/go/bin
go run test.go
実行後、以下の内容が返された場合は、データベースへの接続に成功し、サンプルステートメントが正しく実行されたことを意味します:
PS D:\demo\go-demo\gorm-oceanbase> go run test.go
1
<nil>
1
{1 OceanBase 12 2022-06-01 08:00:00 +0800 CST}
<nil>
1
{1 ob 13 2023-06-01 00:00:00 +0000 UTC}
<nil>
1
1
<nil>
1
time="2023-08-09T15:55:46+08:00" level=debug msg=DropTable duration=589.2031ms
2023/08/09 15:55:47 D:/demo/go-demo/gorm-oceanbase/test.go:85 SLOW SQL >= 200ms
[336.194ms] [rows:0] DROP TABLE IF EXISTS `users` CASCADE
プロジェクトコードについて
gorm-oceanbase をクリックしてプロジェクトコードをダウンロードします。これは、gorm-oceanbase という名前の圧縮ファイルです。 解凍すると、gorm-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 gorm-oceanbase:これはプロジェクトのモジュール名であり、プロジェクトのネームスペースを定義しています。Go 1.16以降では、モジュール名とプロジェクトのルートディレクトリ名がマッチしている必要があります。go 1.20:これはプロジェクトに必要なGoのバージョンです。require:これはプロジェクトの依存関係宣言です。これは、プロジェクトが依存するサードパーティライブラリとそのバージョン情報をリストアップしたものです。この依存関係は間接的な依存関係であり、別の依存関係であるgo.sumと関連付けられています。github.com/go-sql-driver/mysql:Go-SQL-Driver/MySQLドライバーは、MySQLデータベースに接続し、操作を実行するために使用されます。github.com/jinzhu/inflection:文字列変換ライブラリです。文字列を単数形、複数形、キャメルケースなどに変換するために使用します。github.com/jinzhu/now:時間処理ライブラリです。現在時刻の取得、時間差の計算、時刻のフォーマット変換などの機能を提供します。github.com/sirupsen/logrus:ログライブラリです。プログラムの実行時のログ情報を記録するために使用されます。golang.org/x/sys:システムライブラリです。システムレベルの操作関数と定数を提供します。golang.org/x/text:テキスト処理ライブラリです。Unicode文字列や数値のフォーマット処理などを行うために使用されます。gorm.io/driver/mysql:GORMのMySQLドライバーです。GORMでMySQLデータベースに接続し、操作を実行するために使用されます。gorm.io/gorm:GORM ORMフレームワークです。データベース操作を簡素化するために使用されます。
コードは以下のとおりです:
module gorm-oceanbase
go 1.20
require (
github.com/go-sql-driver/mysql v1.7.1 // indirect
github.com/jinzhu/inflection v1.0.0 // indirect
github.com/jinzhu/now v1.1.5 // indirect
github.com/sirupsen/logrus v1.9.3 // indirect
golang.org/x/sys v0.5.0 // indirect
golang.org/x/text v0.12.0 // indirect
gorm.io/driver/mysql v1.5.1 // indirect
gorm.io/gorm v1.25.2 // indirect
)
go.sumコードの紹介
go.sum ファイルは、プロジェクトの依存関係情報を定義するために使用されます。各依存関係は、ライブラリの名前、バージョン番号、ハッシュ値の3つの部分で構成されています。
go.sum ファイルには、以下の内容が含まれています:
github.com/sirupsen/logrus:ログライブラリです。プログラムの実行時のログ情報を記録するために使用されます。golang.org/x/text:テキスト処理ライブラリです。Unicode文字列や数値のフォーマット処理などを行うために使用されます。gorm.io/driver/mysql:GORMのMySQLドライバーです。GORMでMySQLデータベースに接続し、操作を実行するために使用されます。gorm.io/gorm:GORM ORMフレームワークです。データベース操作を簡素化するために使用されます。
説明
go.sum ファイルは、実行環境によって必要な依存関係が異なるため、実行時の指示に従って必要な依存関係をダウンロードしてください。
コードは以下のとおりです:
github.com/sirupsen/logrus v1.9.3 h1:dueUQJ1C2q9oE3F7wvmSGAaVtTmUizReu6fjN8uqzbQ=
github.com/sirupsen/logrus v1.9.3/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ=
golang.org/x/text v0.12.0 h1:k+n5B8goJNdU7hSvEtMUz3d1Q6D/XW4COJSJR6fN0mc=
golang.org/x/text v0.12.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE=
gorm.io/driver/mysql v1.5.1 h1:WUEH5VF9obL/lTtzjmML/5e6VfFR/788coz2uaVCAZw=
gorm.io/driver/mysql v1.5.1/go.mod h1:Jo3Xu7mMhCyj8dlrb3WoCaRd1FhsVh+yMXb1jUInf5o=
gorm.io/gorm v1.25.2 h1:gs1o6Vsa+oVKG/a9ElL3XgyGfghFfkKA2SInQaCyMho=
gorm.io/gorm v1.25.2/go.mod h1:L4uxeKpfBml98NYqVqwAdmV1a2nBtAec/cf3fpucW/k=
test.goコードの紹介
test.go ファイルは、Go-SQL-Driver/MySQLドライバーを使用してMySQLデータベースに接続し、GORMが提供するAPIを使用してデータベース操作を行う方法を定義しています。 test.go ファイルには、以下の内容が含まれています:
mainパッケージを定義します。package mainは、実行可能なプログラムのパッケージであることを示します。このパッケージにはmain()関数が含まれており、プログラムの実行時にこの関数が実行されます。importパッケージを定義します。importステートメントで、以下のパッケージをインポートしています:fmt:フォーマットされた入出力の提供に使用される関数です。これは、データを文字列形式にフォーマットしてコンソールやその他のデバイスに出力するための一連の関数を定義しています。time:時間関連の関数とタイプを提供するために使用されます。os:OS関連の関数とタイプを提供するために使用されます。gorm.io/driver/mysql:MySQLデータベースドライバーは、MySQLデータベースに接続し、操作を実行するために使用されます。gorm.io/gorm:Go言語の構造体をデータベーステーブルにマッピングし、データベースのクエリや操作のためのメソッドを提供するために使用されます。golang.org/x/text/transform:文字セット変換やUnicode処理など、テキスト処理の基本機能を提供するために使用されます。github.com/sirupsen/logrus:いくつかのログの出力とフォーマットに関する機能を提供するために使用されます。
コードは以下のとおりです:
import ( "fmt" "time" "os" "gorm.io/driver/mysql" "gorm.io/gorm" "golang.org/x/text/transform" "github.com/sirupsen/logrus" )User構造体を定義します。Userという名前の構造体を定義しています。これはユーザーの基本情報を表すもので、4つのフィールドを含んでいます。ユーザーの一意な識別子ID、ユーザー名Name、ユーザーの年齢Age、ユーザーの誕生日Birthday。コードは以下のとおりです:
type User struct { ID int Name string Age int Birthday time.Time }transformString関数を定義します。transformStringという名前の関数を定義します。この関数は、文字列を指定されたエンコーディング形式に変換するために使用されます。これは、2つのパラメータ、strとencoderを受け取ります。関数はtransform.String関数を呼び出すことで、文字列を指定されたエンコーディング形式に変換します。変換中にエラーが発生した場合は、元の文字列が返されます。最終的に、関数は変換後の文字列または元の文字列を返します。コードは以下のとおりです:
func transformString(str string, encoder transform.Transformer) string { result, _, err := transform.String(encoder, str) if err != nil { return str } return result }main関数を定義します。main関数を呼び出すことで、作成されたユーザー情報の追加、削除、変更、クエリを行い、logrusを使用して対応するデバッグログをコンソールに出力しました。logrusを初期化します。logrusパッケージを使用して、ログ出力を初期化します。ログ出力形式をテキスト形式に、ログレベルをDebugレベルに設定し、標準出力ストリームに出力します。コードは以下のとおりです:
logrus.SetFormatter(&logrus.TextFormatter{}) logrus.SetLevel(logrus.DebugLevel) logrus.SetOutput(os.Stdout)データベースに接続します。
dsnという名前の文字列変数を定義します。この変数は、MySQLデータベースへの接続に必要な情報(ユーザー名、パスワード、ホストアドレス、ポート番号、データベース名、文字セットなど)を含みます。gorm.Open関数を呼び出してMySQLデータベースに接続し、dsn変数とgorm.Configタイプのパラメータを渡し、接続オブジェクトを返します。接続エラーが発生した場合は、エラー情報が出力され、プログラムが終了します。コードは以下のとおりです:
dsn := "user_name:******@tcp(host:port)/schema_name?charset=utf8mb4&parseTime=True&loc=Local" db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{}) if err != nil { fmt.Println(err.Error()) return }データベース操作。
gorm.DBオブジェクトを使用して、データベース操作を行います。これには、自動移行、データの挿入、クエリ、更新、削除などの操作が含まれます。具体的な手順は以下のとおりです:db.AutoMigrate関数を呼び出すと、User構造体に対応するテーブルが自動的に移行されます。テーブルが存在しない場合は、テーブルが作成されます。deferキーワードとdb.Migrator().DropTable関数を用いて、usersテーブルの削除を遅延させます。これは、プログラム終了時にテーブルが削除されることを意味します。userという名前のUser構造体のインスタンスを作成し、データベースに挿入します。- IDが1のユーザーに対するクエリを実行し、クエリ結果を出力します。
- IDが1のユーザーの情報を更新して、データベースに保存します。
- IDが1のユーザーを削除し、削除結果を出力します。
コードは以下のとおりです:
db.AutoMigrate(&User{}) defer db.Migrator().DropTable("users") // 開始時間を記録 start := time.Now() // User構造体のインスタンスをuserという名前で作成し、データベースに挿入します。 user := User{Name: "OceanBase", Age: 12, Birthday: time.Date(2022, 06, 01, 00, 00, 00, 00, time.UTC)} result := db.Create(&user) fmt.Println(user.ID) fmt.Println(result.Error) fmt.Println(result.RowsAffected) // IDが1のユーザーに対するクエリを実行し、クエリ結果を出力します。 user = User{ID: 1} result = db.First(&user) fmt.Println(user) fmt.Println(result.Error) fmt.Println(result.RowsAffected) // IDが1のユーザーの情報を更新し、データベースに保存します。 user = User{ID: 1, Name: "ob", Age: 13, Birthday: time.Date(2023, 06, 01, 00, 00, 00, 00, time.UTC)} result = db.Save(&user) fmt.Println(user) fmt.Println(result.Error) fmt.Println(result.RowsAffected) // IDが1のユーザーを削除し、削除結果を出力します。 user = User{ID: 1} result = db.Delete(&user) fmt.Println(user.ID) fmt.Println(result.Error) fmt.Println(result.RowsAffected)
ログを出力します。
time.Since関数を呼び出してプログラムの実行時間を計算し、logrus.WithFields関数を呼び出してフィールド付きのログレコーダーを作成します。さらにDebug関数を呼び出してログ情報を出力します。コードは以下のとおりです:
logrus.WithFields(logrus.Fields{ "duration": time.Since(start), }).Debug("DropTable")
全コード表示
module gorm-oceanbase
go 1.20
require (
github.com/go-sql-driver/mysql v1.7.1 // indirect
github.com/jinzhu/inflection v1.0.0 // indirect
github.com/jinzhu/now v1.1.5 // indirect
github.com/sirupsen/logrus v1.9.3 // indirect
golang.org/x/sys v0.5.0 // indirect
golang.org/x/text v0.12.0 // indirect
gorm.io/driver/mysql v1.5.1 // indirect
gorm.io/gorm v1.25.2 // indirect
)
github.com/sirupsen/logrus v1.9.3 h1:dueUQJ1C2q9oE3F7wvmSGAaVtTmUizReu6fjN8uqzbQ=
github.com/sirupsen/logrus v1.9.3/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ=
golang.org/x/text v0.12.0 h1:k+n5B8goJNdU7hSvEtMUz3d1Q6D/XW4COJSJR6fN0mc=
golang.org/x/text v0.12.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE=
gorm.io/driver/mysql v1.5.1 h1:WUEH5VF9obL/lTtzjmML/5e6VfFR/788coz2uaVCAZw=
gorm.io/driver/mysql v1.5.1/go.mod h1:Jo3Xu7mMhCyj8dlrb3WoCaRd1FhsVh+yMXb1jUInf5o=
gorm.io/gorm v1.25.2 h1:gs1o6Vsa+oVKG/a9ElL3XgyGfghFfkKA2SInQaCyMho=
gorm.io/gorm v1.25.2/go.mod h1:L4uxeKpfBml98NYqVqwAdmV1a2nBtAec/cf3fpucW/k=
package main
import (
"fmt"
"time"
"os"
"gorm.io/driver/mysql"
"gorm.io/gorm"
"golang.org/x/text/transform"
"github.com/sirupsen/logrus"
)
type User struct {
ID int
Name string
Age int
Birthday time.Time
}
// 文字列を指定されたエンコーディングに変換する
func transformString(str string, encoder transform.Transformer) string {
result, _, err := transform.String(encoder, str)
if err != nil {
return str
}
return result
}
func main() {
// logrusを初期化する
logrus.SetFormatter(&logrus.TextFormatter{})
logrus.SetLevel(logrus.DebugLevel)
logrus.SetOutput(os.Stdout)
dsn := "user_name:******@tcp(host:port)/schema_name?charset=utf8mb4&parseTime=True&loc=Local"
db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{})
if err != nil {
fmt.Println(err.Error())
return
}
db.AutoMigrate(&User{})
defer db.Migrator().DropTable("users")
// 開始時間を記録
start := time.Now()
user := User{Name: "OceanBase", Age: 12, Birthday: time.Date(2022, 06, 01, 00, 00, 00, 00, time.UTC)}
result := db.Create(&user)
fmt.Println(user.ID)
fmt.Println(result.Error)
fmt.Println(result.RowsAffected)
user = User{ID: 1}
result = db.First(&user)
fmt.Println(user)
fmt.Println(result.Error)
fmt.Println(result.RowsAffected)
user = User{ID: 1, Name: "ob", Age: 13, Birthday: time.Date(2023, 06, 01, 00, 00, 00, 00, time.UTC)}
result = db.Save(&user)
fmt.Println(user)
fmt.Println(result.Error)
fmt.Println(result.RowsAffected)
user = User{ID: 1}
result = db.Delete(&user)
fmt.Println(user.ID)
fmt.Println(result.Error)
fmt.Println(result.RowsAffected)
// ログ出力
logrus.WithFields(logrus.Fields{
"duration": time.Since(start),
}).Debug("DropTable")
}
関連ドキュメント
Go-SQL-Driver/MySQLに関する情報は、OceanBaseデータベースのオープンソースコミュニティにも掲載されています。詳細については、Go-SQL-Driver/MySQLを参照してください。
クリックしてgorm-oceanbaseサンプルプロジェクトをダウンロード