Golang操作MySQLの正しい姿勢
5474 ワード
パッケージの理由:は多くのネット上で提供するORMタイプのデータベース操作を見て、比較的に面倒だと感じて、早めに多くの表構造体を配置してから使う必要があって、データ表の多くの項目に対して配置するのが面倒で、golangのmysqlパッケージに対して外層包装を行って、開発中の使用を簡略化します.
実現構想:データベースリンクを構成することにより接続を初期化(接続プールを実現する)し、接続プールパラメータを設定map[string]*sqlを格納する.DBでは、必要に応じて呼び出す. Structメソッドを使用してSQLを前処理し、対応するSQLを実行し、データ を取得する
データベース・リンクの構成例えば、cmsライブラリ、baseライブラリ、smsライブラリの3つのデータベースへのリンクを構成しました.構成コードは次の です.
使用方法は、受信パラメータの種類がmap[string]interface{}(1)である-CReateメソッドを作成する.mapにおけるkeyはデータテーブルの対応するフィールド名であり、valueは作成するデータフィールドに対応する値(2)である.返される結果は、テーブル内の新規データのIDとerror情報であり、新規成功errorはnil である.バッチ作成-BulkCreateメソッド、受信パラメータタイプは[]map[string]interface{}(1)である.結果が影響する行数とerror情報を返し、新しい成功errorはnil である.-deleteを削除する方法(1).Filterでフィルタ条件(2)を設定.結果が影響する行数とerror情報を返し、削除に成功したerrorはnil である.更新-Updateメソッドは、受信パラメータタイプがmap[string]interface{}(1)である.Filterでフィルタ条件(2)を設定.結果が影響する行数とerror情報を返し、更新に成功したerrorはnil である.クエリー(1).単一のデータはGetとして取得する、クエリーされた最初のデータを取得し、返される結果タイプはmap[string]interface{}(2)である.取得したデータはすべてAll、戻り結果タイプは[]map[string]interface{} 複数のクエリー パケットメソッドクエリ
その他の方法の説明 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
実現構想:
データベース・リンクの構成
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
}
使用方法
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)
# 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)
# base auth_user phone 1830000000
affectRows, err :=DB("base").Table("auth_user").Filter("phone=?", "18300000000").Delete()
# 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)
# 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()
その他の方法の説明
実装されていないメソッド
ソースアドレス