Golang操作MySQLの正しい姿勢

5474 ワード

パッケージの理由:
  • は多くのネット上で提供するORMタイプのデータベース操作を見て、比較的に面倒だと感じて、早めに多くの表構造体を配置してから使う必要があって、データ表の多くの項目に対して配置するのが面倒で、golangのmysqlパッケージに対して外層包装を行って、開発中の使用を簡略化します.

  • 実現構想:
  • データベースリンクを構成することにより接続を初期化(接続プールを実現する)し、接続プールパラメータを設定map[string]*sqlを格納する.DBでは、必要に応じて呼び出す.
  • Structメソッドを使用してSQLを前処理し、対応するSQLを実行し、データ
  • を取得する
    データベース・リンクの構成
  • 例えば、cmsライブラリ、baseライブラリ、smsライブラリの3つのデータベースへのリンクを構成しました.構成コードは次の
  • です.
    package config
    
    import (
    	"encoding/json"
    	"fmt"
    	"io/ioutil"
    	"log"
    	"os"
    	"path"
    	"path/filepath"
    )
    
    var (
    	WorkDir          string            //       
    	DBConfig         map[string]string //        
    )
    
    //      Env    
    func init() {
    	//          
    	WorkDir = filepath.Dir(os.Args[0])
    	err := os.Setenv("GOPATH", WorkDir)
    	data, err := ioutil.ReadFile(path.Join(WorkDir, ".env"))
    	if err != nil {
    		log.Fatal(err)
    	}
    	result := make(map[string]string)
    	//  uint8     map    
    	// []byte(data)         byte    
    	err = json.Unmarshal([]byte(data), &result)
    	if err != nil {
    		log.Fatal(err)
    	}
    	//      map
    	dBMap := make(map[string]string)
    	//         
    	CmsConnect := fmt.Sprintf("%s:%s@tcp(%s:%s)/cms?charset=utf8mb4", result["DB_CMS_USER"],
    		result["DB_CMS_PASS"], result["DB_CMS_HOST"], result["DB_CMS_PORT"])
    	BaseConnect := fmt.Sprintf("%s:%s@tcp(%s:%s)/base?charset=utf8mb4", result["DB_BASE_USER"],
    		result["DB_BASE_PASS"], result["DB_BASE_HOST"], result["DB_BASE_PORT"])
    	SmsConnect := fmt.Sprintf("%s:%s@tcp(%s:%s)/sms?charset=utf8mb4", result["DB_SMS_USER"],
    		result["DB_SMS_PASS"], result["DB_SMS_HOST"], result["DB_SMS_PORT"])
    	dBMap["cms"], dBMap["base"], dBMap["sms"] = CmsConnect, BaseConnect, SmsConnect
    	DBConfig = dBMap
    }
    

    使用方法
  • は、受信パラメータの種類がmap[string]interface{}(1)である-CReateメソッドを作成する.mapにおけるkeyはデータテーブルの対応するフィールド名であり、valueは作成するデータフィールドに対応する値(2)である.返される結果は、テーブル内の新規データのIDとerror情報であり、新規成功errorはnil
  • である.
    import . "mysqldb"
    #     base  auth_user       ,           phone,  real_name,  sex
    createMap := make(map[string]interface{})
    createMap["phone"], createMap["name"], createMap["sex"] = "18300000000", "  ", 1
    insertId, err := DB("base").Table("auth_user").Create(createMap)
    
  • バッチ作成-BulkCreateメソッド、受信パラメータタイプは[]map[string]interface{}(1)である.結果が影響する行数とerror情報を返し、新しい成功errorはnil
  • である.
    #     base  auth_user       ,           phone,  real_name,  sex
    var createMap []map[string]interface{}
    cMap := make(map[string]interface{})
    cMap["phone"], cMap["name"], cMap["sex"] = "18300000000", "  ", 1
    createMap = append(createMap, cMap)
    cMap["phone"], cMap["name"], cMap["sex"] = "18300000001", "  ", 2
    createMap = append(createMap, cMap)
    insertId, err := DB("base").Table("auth_user").BulkCreate(createMap)
    
  • -deleteを削除する方法(1).Filterでフィルタ条件(2)を設定.結果が影響する行数とerror情報を返し、削除に成功したerrorはnil
  • である.
    #       base  auth_user  phone 1830000000   
    affectRows, err :=DB("base").Table("auth_user").Filter("phone=?", "18300000000").Delete()
    
  • 更新-Updateメソッドは、受信パラメータタイプがmap[string]interface{}(1)である.Filterでフィルタ条件(2)を設定.結果が影響する行数とerror情報を返し、更新に成功したerrorはnil
  • である.
    #       base  auth_user  phone 18300000000        
    createMap := make(map[string]interface{})
    createMap["phone"], createMap["name"], createMap["sex"] = "18300000000", "  ", 1
    affectRows, err := DB("base").Table("auth_user").Filter("phone=?", "18300000000").Update(createMap)
    
  • クエリー(1).単一のデータはGetとして取得する、クエリーされた最初のデータを取得し、返される結果タイプはmap[string]interface{}(2)である.取得したデータはすべてAll、戻り結果タイプは[]map[string]interface{}
  • #       base auth_user  phone 18300000000     
    userData := DB("base").Table("auth_user").Filter("phone=?", "18300000000").Get()
    #       base auth_user  phone 18300000000     
    userData := DB("base").Table("auth_user").Filter("phone=?", "18300000000").All()
    #       base auth_user  phone 18300000000  ID      
    userData := DB("base").Table("auth_user").Filter("phone=?", "18300000000").OrderBy("-id").Get()
    
  • 複数のクエリー
  • #       base auth_user  phone 18300000000,sex 1     
    userData := DB("base").Table("auth_user").Filter("phone=? AND sex=?", "18300000000", 1).Get()
    
  • パケットメソッドクエリ
  • #       base auth_user             
    userData := DB("base").Table("auth_user").Select("phone", "COUNT(1) AS num").Filter("sex=?", 1).GroupBy("phone").All()
    

    その他の方法の説明
  • Executeは、SQLを実行し、影響する行数とerror情報を返す.Errorはnilであり、実行が成功したことを示す
  • FetchOneは、SQLを実行してデータ結果を返し、map[string]interface{}
  • の結果タイプを返します.
  • FetchAll,SQLを実行し、複数のデータ結果を返します.戻り結果タイプは[]map[string]interface{}
  • です.
    実装されていないメソッド
  • 複数のテーブル関連クエリーは、元のSQLを書くことを推奨し、FetchOneまたはFetchAllメソッドを使用して取得データ
  • を実行します.
    ソースアドレス
  • GitHubアドレス:https://github.com/imsgy/imsgy-go
  • コードクラウドアドレス:https://gitee.com/imsgy/mysql-db