概要
Go言語でWebアプリケーションを構築する際、データベースとの接続を簡単に切り替えられる設計はとても便利です。この記事では、Gormを活用してMySQLとSQLiteの接続を切り替える方法を解説します。
この記事を読めば以下のことがわかります:
- Gormとは何か?
- MySQLとSQLiteの接続を切り替える実装方法
- よくある設計パターン「ファクトリ関数」を利用した実践的なコード例
Gormとは?
GormはGo言語用のオープンソースのORM(Object Relational Mapping)ライブラリです。
SQLを書く手間を減らしつつ、データベース操作を簡素化する強力なツールとして知られています。
主な特徴:
- クエリ生成機能が充実しており、簡単にCRUD操作が可能
- 複数のデータベースドライバ(MySQL、PostgreSQL、SQLiteなど)をサポート
- マイグレーション(テーブル構造変更)もコードで管理可能
公式ドキュメント:Gorm
実装例:MySQLとSQLiteを簡単切り替え
以下のコードでは、Gormを活用してMySQLとSQLiteを柔軟に切り替えられる設計を実現しています。
「ファクトリ関数」を利用した汎用性の高いコードを見ていきましょう。
package models
import (
"errors"
"fmt"
"gorm.io/driver/mysql"
"gorm.io/driver/sqlite"
"gorm.io/gorm"
"go-api-newspaper/configs"
)
const (
InstanceSqlLite int = iota // SQLiteを選択する定数
InstanceMySQL // MySQLを選択する定数
)
var (
DB *gorm.DB // グローバルで利用可能なデータベースインスタンス
errInvalidSQLDatabaseInstance = errors.New("invalid sql db instance") // 不正なデータベースインスタンスを扱うエラー
)
// 初期化するモデル(テーブル)をリストで返す関数
func GetModels() []interface{} {
return []interface{}{&Newspaper{}}
}
// データベースのインスタンスを生成するファクトリ関数
func NewDatabaseSQLFactory(instance int) (db *gorm.DB, err error) {
switch instance {
case InstanceMySQL:
// MySQL用の接続情報(DSN: Data Source Name)を構築
dsn := fmt.Sprintf(
"%s:%s@tcp(%s:%d)/%s?charset=utf8mb4&parseTime=True",
configs.Config.DBUser,
configs.Config.DBPassword,
configs.Config.DBHost,
configs.Config.DBPort,
configs.Config.DBName)
db, err = gorm.Open(mysql.Open(dsn), &gorm.Config{})
case InstanceSqlLite:
db, err = gorm.Open(sqlite.Open(configs.Config.DBName), &gorm.Config{})
default:
return nil, errInvalidSQLDatabaseInstance
}
return db, err
}
// データベースをセットする関数(実際にグローバル変数DBにインスタンスを格納)
func SetDatabase(instance int) (err error) {
db, err := NewDatabaseSQLFactory(instance)
if err != nil {
return err
}
DB = db // グローバル変数にセット
return err
}
コード解説
データベース接続を切り替えるファクトリ関数
このコードでは、NewDatabaseSQLFactory
関数を利用して、データベースの接続先を柔軟に切り替えられるようにしています。
1. InstanceSqlLite
と InstanceMySQL
const
を利用して、データベース接続先の種類を識別するための定数を定義しています。
const (
InstanceSqlLite int = iota // SQLiteを選択する定数
InstanceMySQL // MySQLを選択する定数
)
これにより、コード内でデータベースの種類を識別しやすくなります。
2. データベース接続情報(DSN)を動的に生成
MySQLの接続情報は、fmt.Sprintf
を利用して動的に生成されます。
dsn := fmt.Sprintf(
"%s:%s@tcp(%s:%d)/%s?charset=utf8mb4&parseTime=True",
configs.Config.DBUser,
configs.Config.DBPassword,
configs.Config.DBHost,
configs.Config.DBPort,
configs.Config.DBName)
3. gorm.Open
で接続を初期化
Gormが提供する gorm.Open
メソッドを使用して、指定したデータベースに接続します。
db, err = gorm.Open(mysql.Open(dsn), &gorm.Config{})
SQLiteの場合も同様に gorm.Open
を利用して接続します。
まとめ
この記事では、Gormを活用してMySQLとSQLiteの接続を柔軟に切り替える方法について解説しました。ファクトリ関数を活用することで、拡張性と保守性の高い設計を実現できます。
今後、新しいデータベースに対応する際も、ファクトリ関数に新しいケースを追加するだけで対応可能です。ぜひこのコードを参考にして、実際のプロジェクトで活用してみてください!