[GO] [Los] Ich möchte Endpunkte durch Lesen / Schreiben in die Datenbank trennen

Einführung

Um die Replikation zu unterstützen, haben wir beschlossen, den DB-Endpunkt durch Lesen / Schreiben zu teilen. Ich habe untersucht, wie man mit Go / Gorm2 damit umgeht.

Nutzungsumgebung

Aus der Schlussfolgerung

Jede Gorm-Methode ist in einen Typ eingeschlossen, der für jeden Endpunkt mehrere Verbindungen hat. Auf diese Weise kann die Seite, die die Verbindung verwendet, die Datenbank betreiben, ohne den Endpunkt zu kennen.

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...)
}

Reproduzieren

ist, was

[Replikation](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)

Orte der Besorgnis

Für die Teile, die von der Abfrage selbst ausgegeben werden können, wie z. B. "func Exec" und "func Raw", besteht die Möglichkeit sowohl des Lesens als auch des Schreibens, und es ist schwierig zu entscheiden, welche verwendet werden sollen. Dieses Mal habe ich es zum Schreiben zugewiesen. Benutzer möchten es so weit wie möglich verwenden können, ohne die Endpunkte zu kennen ...

abschließend

Ich habe mich für CQRS entschieden und bin der Meinung, dass SQL Solid Writing in erster Linie zunehmen wird. Die Bedeutung der Verwendung von Gorm ist etwas geringer, aber ich würde es gerne sehen, wenn ich die Zuordnung zu Type als ORM betrachte. Ich denke, es wäre gut, nur den Mapping-Teil selbst zu machen! !!

Referenz

Recommended Posts

[Los] Ich möchte Endpunkte durch Lesen / Schreiben in die Datenbank trennen
Ich möchte DB-Informationen in einer Liste speichern
Ich möchte systemd nach Zeitzone verwalten! !!
Ich möchte die Produkte verkaufen, die ich durch Python Scraping Mercari aufgelistet habe
Ich möchte mit Python in eine Datei schreiben
Ich möchte in Python schreiben! (1) Überprüfung des Codeformats
Ich möchte in Python schreiben! (3) Verwenden Sie Mock
Ich möchte die von LINE an S3 gesendeten Fotos speichern
Ich möchte SUDOKU lösen
Ich möchte, dass Sphinx bequem ist und von allen benutzt wird
Ich wollte den AWS-Schlüssel nicht in das Programm schreiben
Ich möchte die HTML-Version der OpenCV 3.1-Version "OpenCV-Python Tutorials" lesen
Ich möchte systemd grob verstehen
Ich möchte Bilder kratzen und trainieren
Ich möchte ○○ mit Pandas machen
Ich möchte Yolos Anmerkung kopieren
Ich möchte mit Python debuggen
Ich möchte die Farbe ändern, indem ich auf den Streupunkt in matplotlib klicke
Ich möchte DB mit Djangos ORM von einer externen Anwendung aus betreiben
Ich möchte jedes Mal, wenn ich sudo bin, von einem hübschen Mädchen verflucht werden! !!
[Google Colab] Ich möchte mehrere Bilder nebeneinander in einer Kachel anzeigen
[Frage] Ich möchte eine Zeichenkette kratzen, die von eindeutigen Tags umgeben ist!
Ich möchte CSV Zeile für Zeile lesen, während ich den Feldtyp konvertiere (während der Fortschrittsbalken angezeigt wird) und ihn verarbeiten.
Ich möchte Spyder an die Taskleiste anheften
Ich möchte Objekte mit OpenCV erkennen
Ich möchte kühl auf die Konsole ausgeben
Ich möchte in der Einschlussnotation drucken
Ich möchte sie alle zusammen kratzen.
Ich möchte mit dem Reim Teil1 umgehen
Ich möchte wissen, wie LINUX funktioniert!
Ich möchte einen Blog mit Jupyter Notebook schreiben
Binden Sie an die Klasse, um YAML zu lesen und zu schreiben
Ich möchte mit dem Reim part3 umgehen
Ich möchte ein Glas aus Python verwenden
Ich möchte eine Python-Umgebung erstellen
Ich möchte Linux auf dem Mac verwenden
Ich möchte eine Pip-Installation mit PythonAnywhere durchführen
Ich möchte Protokolle mit Python analysieren
Ich möchte mit aws mit Python spielen
Ich möchte IPython Qt Console verwenden
Ich möchte den Fortschrittsbalken anzeigen
Ich möchte ein Automatisierungsprogramm erstellen!
Ich möchte Matplotlib in PySimpleGUI einbetten
Ich möchte mit dem Reim part2 umgehen
Ich möchte Android-Apps auf Android entwickeln
Ich möchte, dass CAPTCHA HIWAI-Wörter sagt
Ich möchte mit dem Reim part5 umgehen
Ich möchte mit dem Reim part4 umgehen
Weil ich nicht mit Leuten ausgehen möchte, deren Desktops schmutzig sind
Ich möchte ein Element mit numpy in eine Datei schreiben und es überprüfen.