[Go] Je souhaite séparer les points de terminaison en lisant / en écrivant dans la base de données

introduction

Afin de prendre en charge la réplication, nous avons décidé de diviser le point de terminaison de la base de données par lecture / écriture. J'ai examiné comment le gérer avec Go / Gorm2.

Environnement d'utilisation

De la conclusion

Chaque méthode Gorm est encapsulée dans un type qui a plusieurs connexions pour chaque point de terminaison. En faisant cela, le côté utilisant la connexion peut faire fonctionner le DB sans être conscient du point final.

db/connect.go


package db

import (
	"os"

	"gorm.io/driver/mysql"
	"gorm.io/gorm"
)

type SqlHandler struct {
	ReadConn  *gorm.DB
	WriteConn *gorm.DB
}

func Connect() *SqlHandler {
	readConn, err := gorm.Open(GetDBConfig("read"))
	if err != nil {
		panic(err.Error())
	}

	writeConn, err := gorm.Open(GetDBConfig("write"))
	if err != nil {
		panic(err.Error())
	}

	sqlHandler := SqlHandler{
		ReadConn:  readConn,
		WriteConn: writeConn,
	}

	return &sqlHandler
}

func GetDBConfig(endpoint string) (gorm.Dialector, *gorm.Config) {
	USER := "myUser"
	PASS := "hoge1234"
	PROTOCOL := "tcp(" + endpoint + ":5050)"
	DBNAME := "myDB"
	OPTION := "charset=utf8&parseTime=True&loc=Local"

	mysqlConfig := mysql.Config{
		DSN: USER + ":" + PASS + "@" + PROTOCOL + "/" + DBNAME + "?" + OPTION,
	}

	config := &gorm.Config{}

	return mysql.New(mysqlConfig), config
}

func (handler *SqlHandler) Find(out interface{}, where ...interface{}) *gorm.DB {
	return handler.ReadConn.Find(out, where...)
}

func (handler *SqlHandler) Exec(sql string, values ...interface{}) *gorm.DB {
	return handler.WriteConn.Exec(sql, values...)
}

func (handler *SqlHandler) First(out interface{}, where ...interface{}) *gorm.DB {
	return handler.ReadConn.Find(out, where...)
}

func (handler *SqlHandler) Raw(sql string, values ...interface{}) *gorm.DB {
	return handler.WriteConn.Raw(sql, values...)
}

func (handler *SqlHandler) Create(value interface{}) *gorm.DB {
	return handler.WriteConn.Create(value)
}

func (handler *SqlHandler) Save(value interface{}) *gorm.DB {
	return handler.WriteConn.Save(value)
}

func (handler *SqlHandler) Delete(value interface{}) *gorm.DB {
	return handler.WriteConn.Delete(value)
}

func (handler *SqlHandler) Where(query interface{}, args ...interface{}) *gorm.DB {
	return handler.WriteConn.Where(query, args...)
}

Réplication

c'est quoi

[Réplication](https://ja.wikipedia.org/wiki/%E3%83%AC%E3%83%97%E3%83%AA%E3%82%B1%E3%83%BC%E3%82 % B7% E3% 83% A7% E3% 83% B3)

Lieux de préoccupation

Pour les parties qui peuvent être émises par la requête elle-même, telles que «func Exec» et «func Raw», il existe une possibilité de lecture / écriture, et il est difficile de décider lequel utiliser. Cette fois, je l'ai chargé d'écrire. Autant que possible, les utilisateurs veulent pouvoir l'utiliser sans connaître les endpoints ...

en conclusion

J'ai décidé d'utiliser CQRS, et je pense que l'écriture SQL solide est susceptible d'augmenter en premier lieu. La signification de l'utilisation de Gorm est un peu diminuée, mais je l'aimerais lorsque l'on considère le mappage vers Type comme un ORM. Je pense que ce serait bien de ne faire que la partie cartographie par vous-même! !!

référence

Recommended Posts

[Go] Je souhaite séparer les points de terminaison en lisant / en écrivant dans la base de données
Je souhaite stocker les informations de la base de données dans la liste
Je veux gérer systemd par fuseau horaire! !!
Je souhaite vendre les produits que j'ai listés par python scraping Mercari
Je veux écrire dans un fichier avec Python
Je veux écrire en Python! (1) Vérification du format de code
Je veux écrire en Python! (3) Utiliser des simulacres
Je souhaite enregistrer les photos envoyées par LINE vers S3
Je veux résoudre SUDOKU
Je veux que Sphinx soit pratique et utilisé par tout le monde
Je ne voulais pas écrire la clé AWS dans le programme
Je veux lire la version html de la version "OpenCV-Python Tutorials" OpenCV 3.1
Je veux comprendre à peu près systemd
Je veux gratter des images et les former
Je veux faire ○○ avec les Pandas
Je veux copier l'annotation de yolo
Je veux déboguer avec Python
Je veux changer la couleur en cliquant sur le point de dispersion dans matplotlib
Je souhaite utiliser DB en utilisant l'ORM de Django à partir d'une application externe
Je veux être maudit par une jolie fille à chaque fois que je sudo! !!
[Google Colab] Je souhaite afficher plusieurs images côte à côte dans une vignette
[Question] Je veux gratter une chaîne de caractères entourée de balises uniques!
Je souhaite lire le CSV ligne par ligne lors de la conversion du type de champ (tout en affichant la barre de progression) et le traiter.
Je veux épingler Spyder à la barre des tâches
Je veux détecter des objets avec OpenCV
Je veux sortir froidement sur la console
Je veux imprimer dans la notation d'inclusion
Je veux les gratter tous ensemble.
Je veux gérer la rime part1
Je veux savoir comment fonctionne LINUX!
Je veux écrire un blog avec Jupyter Notebook
Lier à la classe pour lire et écrire YAML
Je veux gérer la rime part3
Je veux utiliser jar de python
Je veux créer un environnement Python
Je veux utiliser Linux sur mac
Je veux installer Python avec PythonAnywhere
Je veux analyser les journaux avec Python
Je veux jouer avec aws avec python
Je souhaite utiliser la console IPython Qt
Je veux afficher la barre de progression
Je veux faire un programme d'automatisation!
Je veux intégrer Matplotlib dans PySimpleGUI
Je veux gérer la rime part2
Je souhaite développer des applications Android sur Android
Je veux que CAPTCHA dise des mots HIWAI
Je veux gérer la rime part5
Je veux gérer la rime part4
Parce que je ne veux pas sortir avec des gens dont le bureau est sale
Je veux écrire un élément dans un fichier avec numpy et le vérifier.