beego ORM は、Go 言語のアプリケーション専用に設計された強力な ORM フレームワークです。主な特徴は以下のとおりです:
- モデル定義、CRUD 操作、関連関係を含む完全な ORM 機能をサポートします。
- MySQL、PostgreSQL、SQLite などの主要なデータベースをサポートします。
- 自動テーブル作成やトランザクション処理などの高度な機能を提供します。
- beego フレームワークとの完璧な統合を実現していますが、単独で使用することも可能です。
本記事では、beego ORM を使用して OceanBase データベースに接続し、テーブルの作成、データの挿入、更新、クエリなどの基本的なデータベース操作を実装する方法について説明します。
前提条件
- Go 1.13以降のバージョンがインストールされていること。
- OceanBaseデータベースがインストール済みで、MySQLテナントが作成されていること。
- OceanBaseデータベースの接続文字列を取得していること。
手順
- OceanBaseデータベースの接続文字列を取得します。
- beego ORMとMySQLドライバーをインストールします。
main.goファイルを作成し、データベース操作を実装します。- プログラムを実行して結果を検証します。
ステップ1:OceanBaseデータベースの接続文字列を取得する
OceanBaseデータベースのデプロイ担当者または管理者から、該当するデータベース接続文字列を取得します。
obclient -h$host -P$port -u$user_name -p$password -D$database_name
パラメータ説明:
$host:OceanBaseデータベースへの接続IPアドレス。OceanBaseデータベースプロキシ(OceanBase Database Proxy、ODP)接続方式ではODPアドレスを使用し、直接接続方式ではOBServerノードのIPアドレスを使用します。$port:OceanBaseデータベースの接続ポート。ODP接続方式のデフォルトポートは2883で、ODPデプロイ時にカスタマイズ可能です。直接接続方式のデフォルトポートは2881で、OceanBaseデータベースのデプロイ時にカスタマイズ可能です。$database_name:アクセス対象のデータベース名。注意
テナントに接続するユーザーには、データベースに対する
CREATE、INSERT、UPDATE、およびSELECT権限が付与されていなければなりません。その他のユーザー権限の詳細については、MySQLモードの権限分類を参照してください。$user_name:テナントの接続アカウント。ODP接続の一般的な形式:ユーザー名@テナント名#クラスタ名またはクラスタ名:テナント名:ユーザー名。直接接続方式の形式:ユーザー名@テナント名。$password:アカウントのパスワード。
その他の接続文字列の情報については、OBClientを使用したOceanBaseテナントへの接続を参照してください。
例:
obclient -hxxx.xxx.xxx.xxx -P2881 -utest_user001@mysql001 -p****** -Dtest
ステップ2:Go言語とbeego ORMのインストール
Go言語とbeego ORMが既にインストール済みの場合は、このステップをスキップしてください。インストールされていない場合は、以下の手順でインストールしてください。
Go言語のインストール
システムパッケージを更新し、必要な依存関係をインストールします:
sudo apt update sudo apt install -y wgetGo言語をダウンロードしてインストールします:
# 最新バージョンのGoをダウンロードします(https://golang.org/dl/ wget https://dl.google.com/go/go1.20.6.linux-amd64.tar.gz # /usr/localディレクトリに解凍します sudo tar -C /usr/local -xzf go1.20.6.linux-amd64.tar.gz # インストールパッケージを削除します rm go1.20.6.linux-amd64.tar.gz環境変数を設定します:
# ~/.bashrcファイルを編集します echo 'export PATH=$PATH:/usr/local/go/bin' >> ~/.bashrc echo 'export GOPATH=$HOME/go' >> ~/.bashrc echo 'export PATH=$PATH:$GOPATH/bin' >> ~/.bashrc # 設定を有効にします source ~/.bashrcインストールを確認します:
go versionインストールが成功した場合、次のような内容が表示されます:
go version go1.20.6 linux/amd64
beego ORMとMySQLドライバーのインストール
作業ディレクトリを作成し、Goモジュールを初期化します:
mkdir -p ~/go/src/beego-oceanbase cd ~/go/src/beego-oceanbase go mod init beego-oceanbasebeego ORMとMySQLドライバーをインストールします:
go get -u github.com/beego/beego/v2 go get -u github.com/go-sql-driver/mysql(オプション)ネットワークの問題で直接インストールできない場合は、Goプロキシを設定できます:
go env -w GOPROXY=https://goproxy.cn,directその後、インストールコマンドを再実行します。
インストールを確認します:
go list -m github.com/beego/beego/v2 go list -m github.com/go-sql-driver/mysqlインストールが成功した場合、対応するバージョン情報が表示されます。
ステップ3:main.goファイルを作成してデータベース操作を実装する
main.goという名前のファイルを作成し、以下のコードを追加します。package main import ( "fmt" "time" "github.com/beego/beego/v2/client/orm" _ "github.com/go-sql-driver/mysql" "github.com/beego/beego/v2/core/logs" ) // User ユーザーモデルを定義する type User struct { Id int `orm:"auto;pk"` Username string `orm:"size(100)"` Email string `orm:"size(100);unique"` Age int `orm:"null"` Created time.Time `orm:"auto_now_add;type(datetime)"` Updated time.Time `orm:"auto_now;type(datetime);null"` } // TableName テーブル名を指定する func (u *User) TableName() string { return "users" } func init() { // ログを初期化する logs.Reset() logs.EnableFuncCallDepth(true) logs.SetLogFuncCallDepth(3) // MySQLドライバーを登録する err := orm.RegisterDriver("mysql", orm.DRMySQL) if err != nil { logs.Error("MySQLドライバーの登録に失敗しました:", err) return } // データベースを登録する dataSource := "root@mysql001:**********@tcp(xxx.xxx.xxx.xxx:2881)/db_test?charset=utf8mb4&parseTime=true&loc=Local" err = orm.RegisterDataBase("default", "mysql", dataSource) if err != nil { logs.Error("データベースの登録に失敗しました:", err) return } // 接続プールを設定する db, err := orm.GetDB("default") if err != nil { logs.Error("データベース接続の取得に失敗しました:", err) return } db.SetMaxIdleConns(10) db.SetMaxOpenConns(30) db.SetConnMaxLifetime(5 * time.Minute) // モデルを登録する orm.RegisterModel(new(User)) // テーブルの自動作成(テーブルが存在しない場合) err = orm.RunSyncdb("default", false, true) if err != nil { logs.Error("テーブルの自動作成に失敗しました:", err) return } logs.Info("データベースの初期化に成功しました") } func main() { // ormオブジェクトを取得する o := orm.NewOrm() // データを挿入する user := &User{ Username: "example_user", Email: "user@example.com", Age: 28, } logs.Info("データの挿入を開始します...") id, err := o.Insert(user) if err != nil { logs.Error("データの挿入に失敗しました:", err) return } logs.Info(fmt.Sprintf("データの挿入に成功しました, ID: %d", id)) // データをクエリする readUser := &User{Id: int(id)} err = o.Read(readUser) if err != nil { logs.Error("データのクエリに失敗しました:", err) return } logs.Info(fmt.Sprintf("データのクエリに成功しました: %+v", readUser)) // データを更新する readUser.Age = 29 readUser.Updated = time.Now() _, err = o.Update(readUser) if err != nil { logs.Error("データの更新に失敗しました:", err) return } logs.Info("データの更新に成功しました") // すべてのデータをクエリする var users []*User _, err = o.QueryTable("users").All(&users) if err != nil { logs.Error("すべてのデータのクエリに失敗しました:", err) return } logs.Info(fmt.Sprintf("現在のユーザー数: %d", len(users))) // データを削除する _, err = o.Delete(readUser) if err != nil { logs.Error("データの削除に失敗しました:", err) return } logs.Info("データの削除に成功しました") }
ステップ4:プログラムを実行し、結果を検証する
プログラムの実行:
cd ~/go/src/beego-oceanbase go run main.gogo: command not foundエラーが発生した場合は、ステップ2の説明に従ってGo環境変数を正しく設定していることを確認してください。プログラムの実行が完了すると、次のような出力が表示されるはずです:
create table `users` -- -------------------------------------------------- -- Table Structure for `main.User` -- -------------------------------------------------- CREATE TABLE IF NOT EXISTS `users` ( `id` integer AUTO_INCREMENT NOT NULL PRIMARY KEY, `username` varchar(100) NOT NULL DEFAULT '' , `email` varchar(100) NOT NULL DEFAULT '' UNIQUE, `age` integer, `created` datetime NOT NULL, `updated` datetime ) ENGINE=INNODB; 2025/06/10 11:08:42.497 [I] [main.go:67] データベースの初期化に成功しました 2025/06/10 11:08:42.497 [I] [main.go:81] データの挿入を開始します... 2025/06/10 11:08:42.544 [I] [main.go:87] データの挿入に成功しました, ID: 1 2025/06/10 11:08:42.550 [I] [main.go:96] データのクエリに成功しました: &{Id:1 Username:example_user Email:user@example.com Age:28 Created:2025-06-10 11:08:42 +0800 CST Updated:2025-06-10 11:08:42 +0800 CST} 2025/06/10 11:08:42.553 [I] [main.go:107] データの更新に成功しました 2025/06/10 11:08:42.554 [I] [main.go:116] 現在のユーザー数: 1 2025/06/10 11:08:42.556 [I] [main.go:124] データの削除に成功しました