go install github.com/fraenky8/tables-to-go@latest
15 Oktober 2023
Standardvorgehen, um Datenbank-Daten mit Go zu lesen oder zu schreiben ist die Benutzung des "database/sql" Package. Selects werden in der Regel, d.h. wenn es sich nicht um einen einzelnen Spaltenwert handelt mit einem "struct" oder einer Liste von "structs" verarbeitet.
Ein "struct" bildet dabei jeweils eine Datenbanktabelle ab. Es ist mühsam und fehleranfällig, "structs" für jede Tabelle manuell zu pflegen.
Tables-To-Go kann structs reverse aus einem vorhandenen Datenbankmodell erstellen. Dies funktioniert z.B. mit MySQL, Postgres und (über einen im Repository beschriebenen Umweg, d.h. Klonen des Repositories und Ausführen von " make sqlite3" auch) mit SQLite.
Tables-To-Go lässt sich mit diesem Befehl installieren:
go install github.com/fraenky8/tables-to-go@latest
Nach der Installation mit "go install" oder "make sqlite3" steht eine ausführbare Datei "tables-to-go" im Verzeichnis "~/go/bin" bereit"
Die structs für alle Tabellen einer Datenbank lassen sich für Postgres (dem Standardfall) mit folgendem Befehl erstellen
tables-to-go -h <ip der Datenbank> -d <DB-Name> -u <Benutzer> -p <Passwort> -pn <Go-Paketname>
oder mit weiteren Parametern
tables-to-go -v -t pg -h <ip der Datenbank> -port <DB-Port> -d <DB-Name> -u <Benutzer> -p <Passwort> -pn <Go-Paketname> -pre <Prefix> -suf <Postfix> -of <Ausgabeverzeichnis>
Die structs für alle Tabellen einer Datenbank lassen sich für SQLite3 mit folgendem Befehl erstellen
tables-to-go -v -t sqlite3 -d <..Pfad/zur/Datenbank/dbname.sqlite> -of <Ausgabeverzeichnis> -suf <Postfix>
Die Tabelle "app_user" in einer Postgres-Datenbank sieht folgendermaßen aus:
Der Befehl:
tables-to-go -v -t pg -h localhost -port 15432 -d mp3 -u psqladmin -p postgres -pn model -suf _entity -of model
erzeugt das "struct" "AppUserEntity" im Unterverzeichnis "model" (Das Verzeichnis muss bereits existieren).
package model
import (
"database/sql"
"time"
)
type AppUserEntity struct {
ID int `db:"id"`
UserCode string `db:"user_code"`
LastName string `db:"last_name"`
FirstName sql.NullString `db:"first_name"`
Email string `db:"email"`
Password string `db:"password"`
Role sql.NullString `db:"role"`
Enabled sql.NullBool `db:"enabled"`
Created time.Time `db:"created"`
}