Betreiben Sie den Db2-Container mit Go

Hallo. Dieses Mal werde ich vorstellen, wie ein mit Docker with Go eingerichteter Db2-Container betrieben wird. In den folgenden Artikeln finden Sie Informationen zum Einrichten eines Db2-Containers und zum Einfügen von Daten während des Setups.

Richten Sie einen Db2-DB-Container ein und fügen Sie ein paar Daten ein Setup mit anfänglichen Testdaten in Db2 / DB-Container eingefügt

Dieses Mal werden wir den Db2-Container mit eingefügten Daten starten und hauptsächlich die Implementierung in Go vorstellen.

Codes finden Sie unter hier.

Überblick

Der Inhalt ist für diejenigen gedacht, die Daten in den Db2-Container einfügen konnten, aber wie sie die Daten tatsächlich abrufen und bedienen oder aktualisieren können.

Dieses Mal werde ich vorstellen, wie Daten aus Db2 in der Sprache Go abgerufen werden.

Entwicklungsumgebung

Annahme

Getting Started Die Entwicklungsumgebung ist Windows, kann jedoch unter Mac oder Linux ausgeführt werden.

Dieses Mal konzentrieren wir uns auf die Überprüfung der Kommunikation mit Db2, daher haben wir es nicht zu einer API gemacht. Ich werde ein Programm schreiben, das einfach Daten von Db2 abruft und an die Konsole ausgibt. (Eines Tages werde ich auch die REST-API-Implementierung in Go einführen.)

1. Erläuterung der Ordnerstruktur

Zunächst erkläre ich die Ordnerstruktur.

project


project
├─go
|  ├─model
|  |     ├─user.go
|  |     ├─tweet.go
|  |     └─reply.go
|  └─main.go
└─db  
   ├─data
   |    ├─users_insert.csv
   |    ├─tweets_insert.csv
   |    └─replys_insert.csv
   ├─sql
   |   ├─users_create.sql
   |   ├─tweets_create.sql
   |   └─replys_create.sql
   ├─createschema.sh
   ├─Dockerfile
   └─env.list

Eigentlich möchte ich ein domänengesteuertes Design, eine Benutzerdomäne, eine Infrastruktur usw. erstellen und ein cooles Design erstellen, aber das ist eine weitere Möglichkeit.

2. Starten des Containers

Verwenden Sie zuerst "Dockerfile", um das Container-Image zu erstellen. Der auszuführende Befehl lautet wie folgt.

$ cd db
$ docker build -t test-db:v1.0 .

Nachdem das Container-Image vollständig ist, führen wir es sofort aus.

$ docker run --name go-db --restart=always --detach --privileged=true -p 50000:50000 --env-file env.list test-db:v1.0

Eine ausführliche Erklärung finden Sie unter hier.

Wichtig hierbei ist, dass der Port um 50000: 50000 weitergeleitet wird. Beachten Sie, dass der 50000-Port, der für den Client verfügbar ist, beim Herstellen einer Verbindung zur Datenbank angegeben werden muss.

3. Zu importierendes Paket

Paket zu verwenden

3.1. go_ibm_db 基本的にGoでDb2を利用する際は、github.com/ibmdb/go_ibm_dbというパッケージを利用します。

Drücken Sie den folgenden Befehl.

$ go get github.com/ibmdb/go_ibm_db

Darüber hinaus ist ein Treiber für den Betrieb von SQL erforderlich, um die Datenbank zu betreiben. Da es verschiedene Operationen gibt, werde ich es in der richtigen Reihenfolge tun.

まず、落としてきたgithub.com/ibmdb/go_ibm_dbを見に行きます。 Wahrscheinlich wird es unter "GOPATH" abgelegt. Wenn Sie also diese Hierarchie durchgehen, gelangen Sie in einen Ordner namens "Installer". Die setup.go in diesem Ordner ist das Clidriver-Download-Skript.

$ cd PathToInstaller/installer
$ go run setup.go

Jetzt kann clidriver unter installer heruntergeladen werden. (Wenn Sie einen Berechtigungsfehler erhalten, versuchen Sie, die Berechtigungen im Installationsordner zu ändern.) Ich habe das Gefühl, dass es einige Zeit dauern wird.

Wenn Sie es sicher ablegen können, müssen Sie den Pfad "PathToInstaller / installer / clidriver / bin" übergeben. Lassen Sie uns ihn also übergeben. Damit ist die Einrichtung von go_ibm_db abgeschlossen.

Wenn Sie keine zusätzlichen Pakete in Ihre Umgebung ablegen möchten, können Sie dies mit go mod tun. Selbst in diesem Fall ist jedoch "sqlcli.h" erforderlich. Kopieren Sie daher das installierte Installationsprogramm in das Projekt, übergeben Sie den Pfad "clidriver / bin" mit einem Shell-Skript usw. und geben Sie das zu erstellende Modul an. Sie können dabei eine ausführbare Datei generieren.

3.2. errors Es implementiert auch Fehler, also lassen Sie auch das "Fehler" -Paket fallen.

$ go get github.com/pkg/errors

4. Implementierung von Go

Grundsätzlich ist die Implementierung wirklich wie in 3 eingeführt. Ich werde es vorstellen, während ich mir die Hauptfunktion von main.go anschaue.

Zuerst diesen Code

main.go


  config := "HOSTNAME=localhost;DATABASE=USERDB;PORT=50000;UID=db2inst1;PWD=password"
	conn, err := sql.Open("go_ibm_db", config)
	if err != nil {
		fmt.Printf("Verbindung zur Datenbank fehlgeschlagen.%+v", err)
	}
	defer conn.Close()

Speichern Sie die DB-Verbindungsinformationen in config. Verwenden Sie außer HOSTNAME und PORT die Informationen auf env.list. Stellen Sie eine Verbindung mit der Datenbank her, unter der sich "sql.Open" befindet. Das erste Argument gibt den Treibernamen an. Diesmal ist es go_ibm_db. Das zweite Argument gibt die DB-Verbindungsinformationen an. Da es möglich ist, einen Fehler zu machen, ist es notwendig, den Fehler zu behandeln. Die Verbindung muss immer geschlossen sein. Verwenden Sie daher Go's Praxis "Aufschieben", um die Verbindung zu schließen.

Sie haben jetzt eine Verbindung mit dem Db2-Container erhalten. Wir werden dies verwenden, um die Daten zu manipulieren.

Zuerst erhalten wir alle Benutzer, speichern die Informationen in der Benutzerstruktur und erstellen ein Array von Instanzen.

main.go


users, err := model.GetAllUser(conn)
if err != nil {
  fmt.Printf("Fehlgeschlagen zu bekommen%+v", err)
}

Schauen wir uns nun user.go an, das den Benutzer DAO und DTO definiert.

user.go


// User is users entity
type User struct {
	id        string
	name      string
	mail      string
	password  string
	createdAt time.Time
	updatedAt time.Time
}

func (u *User) String() string {
	return fmt.Sprintf(
		"Nutzername:%s",
		u.name,
	)
}

// GetID returns user's id
func (u *User) GetID() string {
	return u.id
}

Die Benutzerstruktur definiert tabellendefinierte Spalten in Feldern. Die GetID-Methode ist eine Methode zum Abrufen der Benutzer-ID. Ich schreibe dies, weil die Felder in der Benutzerstruktur privat angegeben werden, um die ID an Abfragen in anderen Tabellen zu übergeben. Nun, ich denke, dass dieser Bereich ähnliche Dinge in anderen Sprachen tun wird.

Darunter gibt es eine Methode, um alle Benutzer zu erhalten,

user.go


// GetAllUser returns all user instances
func GetAllUser(conn *sql.DB) ([]User, error) {
	selectAllUserQuery := `SELECT * FROM users`

	selectAllUserPstmt, err := conn.Prepare(selectAllUserQuery)
	if err != nil {
		return []User{}, errors.Wrapf(err, "Die Erstellung der Anweisung ist fehlgeschlagen")
	}

	var users []User

	rows, err := selectAllUserPstmt.Query()
	if err != nil {
		return []User{}, errors.Wrap(err, "Abfrageausführung fehlgeschlagen")
	}
	for rows.Next() {
		var user User
		if err := rows.Scan(
			&user.id,
			&user.name,
			&user.mail,
			&user.password,
			&user.createdAt,
			&user.updatedAt,
		); err != nil {
			return []User{}, errors.Wrap(err, "Ergebnis Lesefehler")
		}
		users = append(users, user)
	}
	return users, nil
}

Es gibt verschiedene Möglichkeiten, es hier zu schreiben. Nachdem Sie die Anweisung mit der Prepare () -Methode vorbereitet haben, schreiben Sie sie, indem Sie die Abfrage ausführen.

Wenn Sie dies tun, werden die abgerufenen Datensätze in "Zeilen" gespeichert. rows hat eine Next-Methode, und Sie können jeden Datensatz mit einer for-Anweisung drehen. Wenn Sie die Benutzerinstanzinformationen an "rows.Scan ()" übergeben, werden die Datensatzinformationen dort gespeichert.

Sie haben jetzt Ihre Benutzerinformationen in Ihrer Benutzerinstanz gespeichert. Gibt ein Array von Benutzern zurück.

Kehren wir zum Hauptfach zurück.

Von nun an werde ich die ID von der Benutzerinstanz abrufen, sie an die WHERE-Klausel von Tweet übergeben und den dem Benutzer zugeordneten Datensatz abrufen. Die ID wird weiter aus dem abgerufenen Tweet-Datensatz abgerufen, die damit verbundene Antwort wird abgerufen und ausgegeben und für den Benutzerdatensatz verarbeitet.

main.go


//Da die Anzahl der Fälle gering ist, verwenden Sie ein Triple für die Anweisung.
	for _, user := range users {
		fmt.Println(user.String())
		tweets, err := model.GetAllTweets(conn, user.GetID())
		if err != nil {
			fmt.Printf("Fehlgeschlagen zu bekommen%+v", err)
		}
		for _, tweet := range tweets {
			fmt.Println(tweet.String())
			replys, err := model.GetAllReplys(conn, tweet.GetID())
			if err != nil {
				fmt.Printf("Fehlgeschlagen zu bekommen", err)
			}
			for _, reply := range replys {
				fmt.Println(reply.String())
			}
		}
	}

Um die ID an die "WHERE-Klausel" zu übergeben, setzen Sie die SQL-Anweisung auf "?", Wie "SELECT * FROM Tweets WHERE user_id =?". Sie können die WHERE-Klausel anpassen, indem Sie für jeden Parameter ein zweites Argument angeben.

Wie schreibt man rows, err := selectAllTweetPstmt.Query(userID) Es sieht aus wie das.

5. Ausführungsergebnis

Bei Ausführung unter Windows wird der japanische Teil als verstümmelte Zeichen angezeigt, wenn der Wert vom Container empfangen wird. Da es sich bei dem in Db2 verwendeten Container um einen Linux-Container handelt, scheint dies darauf zurückzuführen zu sein, dass die Zeichenfolge mit dem Zeichencode UTF-8 gesendet wird.

Das Ausführungsergebnis ist wie folgt.

Nutzername:hoge
Tweet Körper:�����̓e�X�g�ł��B,Erstellungsdatum:2020-10-09 12:00:00 +0900 JST
Antwort Benutzername:fugaaaa,Antworttext:�e�X�g�m�F���܂����B,Erstellungsdatum:2020-10-11 12:00:00 +0900 JST
-----------------------
Nutzername:fuga
Tweet Körper:�����̓e�X�g�ł��B,Erstellungsdatum:2020-10-10 12:00:00 +0900 JST
Antwort Benutzername:hogeeee,Antworttext:�e�X�g�m�F���܂����B,Erstellungsdatum:2020-10-11 12:00:00 +0900 JST
-----------------------

Nun, die Charaktere sind verstümmelt. traurig. Deshalb werde ich das Ergebnis der Ausführung auf einem Mac veröffentlichen.

Nutzername:hoge
Tweet Körper:Dies ist ein Test.,Erstellungsdatum:2020-10-09 12:00:00 +0900 JST
Antwort Benutzername:fugaaaa,Antworttext:Ich habe den Test bestätigt.,Erstellungsdatum:2020-10-11 12:00:00 +0900 JST
-----------------------
Nutzername:fuga
Tweet Körper:Dies ist ein Test.,Erstellungsdatum:2020-10-10 12:00:00 +0900 JST
Antwort Benutzername:hogeeee,Antworttext:Ich habe den Test bestätigt.,Erstellungsdatum:2020-10-11 12:00:00 +0900 JST
-----------------------

So kann ich es von Db2 bekommen.

6. Zusammenfassung

Ich habe die Methode zum Verbinden mit dem Db2-Container mit Go eingeführt, trotz der schädlichen Auswirkungen des Zeichencodes.

Damit kann die API-Entwicklung einfach durchgeführt werden.

Recommended Posts

Betreiben Sie den Db2-Container mit Go
Betreiben Sie den Linux-Netzwerk-Namespace mit Go
Python mit Go
Kinesis mit Python betreiben
Betreiben Sie Blender mit Python
Betreiben Sie Excel mit Python (1)
Betreiben Sie Excel mit Python (2)
Probieren Sie die DB-Operation mit Python aus und visualisieren Sie sie mit d3
Betreiben Sie Excel mit Python Open Pyxl
Zeichnen Sie die Bezier-Kurve mit Go
Betreiben Sie TwitterBot mit Lambda, Python
Erste Schritte mit Go Assembly
Vollbit-Suche mit Go
Stellen Sie mit GO eine Verbindung zu Postgresql her
[Hinweis] Betreiben Sie MongoDB mit Python
Arbeiten Sie mit Websites mit Python_Webbrowser
Versuchen Sie, Parfüm mit Go zu implementieren
[Python] [SQLite3] Betreiben Sie SQLite mit Python (Basic)
ROS Kurs 105 Betriebstio mit ROS
Betreiben Sie Nutanix mit der REST-API Teil 2
Versuchen Sie, Facebook mit Python zu betreiben
Sehen Sie sich Wale mit Kombinationsoptimierung an
Tipps zum Ausführen Gehen Sie mit Docker
Realisieren Sie den DB-Verbindungspool mit Golang
Betreiben Sie ECHONET Lite-Haushaltsgeräte mit Python
Betreiben Sie Maya mit OSC von vvvv
Verwenden Sie die Curl / JQ-Bibliothek mit Go