golangコードに基づいてデータベースschemeを自動的に更新

2313 ワード

description:データベースが頻繁に構造を更新する必要がある場合、コードとデータベースが一致しにくいのは煩わしい問題である.golangのgormライブラリは、AutoMigration機能があり、goのstruct tagに基づいてデータベース構造を自動的に更新することができ、非常に便利です.
最近、書き込みテストでは、各ユニットのテストが実行時に自動的にデータベースを空にすることが望ましいことが明らかになった.gormのAutoMigration機能はこの機能を満たすことができる.
Auto Migration

Automatically migrate your schema, to keep your schema update to date.

WARNING: AutoMigrate will ONLY create tables, missing columns and missing indexes, and WON'T change existing column's type or delete unused columns to protect your data.

最も重要なのは、インデックス(index)、制約(constrants)、タイプ(type)、デフォルト値(default)を設定することができますが、ドキュメントには詳しく紹介されていません.私の検索とテストを経て、やっとすべての関係がわかりました.
AutoMigrationはstruct tagに基づいて新しいテーブルを作成するだけで、ないカラムとインデックスは、既存のカラムのタイプを変更したり、使用していないカラムを削除したりしません.動的更新が必要な場合は、auto migrationの前のDROP TABLEでテーブル全体を削除して再構築する必要がある.次のようになります.
func clearDatebase() {
    db := GetTestClient().NewConn()
    db.Exec("DROP TABLE books")
    db.AutoMigrate(&mystructtag.books{})
    db.Exec("DROP TABLE book_users")
    db.AutoMigrate(&mystructtag.book_users{})
}

gorm:
  • primary_key設定キー
  • not null非空拘束
  • size:64タイプサイズ、通常はvarchar
  • を指す
    以上は主にsizeとnot nullがドキュメントに現れていないので、他は例から見つけることができて、自分の意会です.
    type User struct {
        gorm.Model
        Birthday     time.Time
        Age          int
        Name         string  `gorm:"size:255"` // Default size for string is 255, reset it with this tag
        Num          int     `gorm:"AUTO_INCREMENT"`
    
        CreditCard        CreditCard      // One-To-One relationship (has one - use CreditCard's UserID as foreign key)
        Emails            []Email         // One-To-Many relationship (has many - use Email's UserID as foreign key)
    
        BillingAddress    Address         // One-To-One relationship (belongs to - use BillingAddressID as foreign key)
        BillingAddressID  sql.NullInt64
    
        ShippingAddress   Address         // One-To-One relationship (belongs to - use ShippingAddressID as foreign key)
        ShippingAddressID int
    
        IgnoreMe          int `gorm:"-"`   // Ignore this field
        Languages         []Language `gorm:"many2many:user_languages;"` // Many-To-Many relationship, 'user_languages' is join table
    }