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