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