0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Go言語 × GormでMySQLとSQLiteを簡単切り替え!データベース接続管理の方法

Posted at

概要

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. InstanceSqlLiteInstanceMySQL

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の接続を柔軟に切り替える方法について解説しました。ファクトリ関数を活用することで、拡張性と保守性の高い設計を実現できます。

今後、新しいデータベースに対応する際も、ファクトリ関数に新しいケースを追加するだけで対応可能です。ぜひこのコードを参考にして、実際のプロジェクトで活用してみてください!

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?