Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

DeKugelschieber

Community-Fossil

  • »DeKugelschieber« ist der Autor dieses Themas

Beiträge: 2 641

Wohnort: Rheda-Wiedenbrück

Beruf: Software-Entwickler

  • Private Nachricht senden

1

25.11.2017, 15:07

Gondolier (Golang Datenbank Migrations Bibliothek)

Hallo Leute,

ich habe meine Migrations Biblothek "fertig" und wollte euch diese mal kurz präsentieren.
Zunächst: es gab bis jetzt keine Migrations Lib die die Migration nur über das Datenmodell in Go (also structs) abbilden kann. Die die existieren führen einfach SQL Scripte in der richtigen Reihenfolge aus, was sicherlich seine Vorteile hat (vor allem zuverlässiger ist), aber ich immer etwas mühsam finde. Gondolier kann nur aus dem Go Code + Dekoratoren das Datenbankschema erzeugen und updaten:

Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
type Customer struct {
    Id   uint64 `gondolier:"type:bigint;id"`
    Name string `gondolier:"type:varchar(255);notnull"`
    Age  int    `gondolier:"type:integer;notnull"`
}

type Order struct {
    Id    uint64 `gondolier:"type:bigint;id"`
    Buyer uint64 `gondolier:"type:bigint;fk:customer.id;notnull"`
}

type OrderPosition struct {
    Id       uint64 `gondolier:"type:bigint;id"`
    Order    uint64 `gondolier:"type:bigint;fk:order.id;notnull"`
    Quantity int    `gondolier:"type:integer;notnull"`
    Cost     int    `gondolier:"type:integer;notnull"`
}

type Obsolete struct{}

func main() {
    // connect to database
    db, _ := sql.Open("postgres", dbString())
    defer db.Close()

    // migrate your schema
    gondolier.Use(db, &gondolier.Postgres{Schema: "public",
        DropColumns: true,
        Log:         true})
    gondolier.Model(Customer{}, Order{}, OrderPosition{})
    gondolier.Drop(Obsolete{})
    gondolier.Migrate()
}


Wie man sieht werden die nötigen Meta Informationen über Dekoratoren (hinten das gondolier:"...) in struct eingefügt und dann einfach an Gondolier übergeben. In diesem Beispiel kommen dann drei Tabellen dabei raus customer, order und order_position mit entsprechenden Spalten, Constraints und Foreign Keys. Wenn man nun etwas am Schema (also am Modell) in Go ändert und die Anwendung neu startet werden die Änderungen auch am Schema übernommen. Natürlich muss man schon gucken, dass die Änderungen auch möglich sind, ich kann also nicht einfach von gondolier:"type:integer" auf gondolier:"type:text" wechseln, weil die Datenbank (nur Postgres aktuell) das nicht kann.

Mich würde mal interessieren was ihr von dieser Bibliothek haltet, ob das ganze sinnvoll ist oder ob ihr sagt das könnte nicht robust genug sein (aktuell kann ich das selbst nicht so genau sagen). Die Testabdeckung ist > 90% und ich habe eine große Anwendung die Gondolier bereits nutzt.

GitHub: https://github.com/emvicom/gondolier
GitHub komplettes Beispiel (lauffähig): https://github.com/emvicom/gondolier-example

DeKugelschieber

Community-Fossil

  • »DeKugelschieber« ist der Autor dieses Themas

Beiträge: 2 641

Wohnort: Rheda-Wiedenbrück

Beruf: Software-Entwickler

  • Private Nachricht senden

2

25.11.2017, 15:41

Gondolier wurde übrigens in awesome-go aufgenommen: https://github.com/avelino/awesome-go

DeKugelschieber

Community-Fossil

  • »DeKugelschieber« ist der Autor dieses Themas

Beiträge: 2 641

Wohnort: Rheda-Wiedenbrück

Beruf: Software-Entwickler

  • Private Nachricht senden

3

04.12.2017, 23:07

So hier nun auch das erste richtige Release: https://github.com/emvicom/gondolier/releases/tag/1.0

Werbeanzeige