golangコードに基づいてデータベースschemeを自動的に更新
2313 ワード
description:データベースが頻繁に構造を更新する必要がある場合、コードとデータベースが一致しにくいのは煩わしい問題である.golangのgormライブラリは、AutoMigration機能があり、goのstruct tagに基づいてデータベース構造を自動的に更新することができ、非常に便利です.
最近、書き込みテストでは、各ユニットのテストが実行時に自動的にデータベースを空にすることが望ましいことが明らかになった.gormのAutoMigration機能はこの機能を満たすことができる.
最も重要なのは、インデックス(index)、制約(constrants)、タイプ(type)、デフォルト値(default)を設定することができますが、ドキュメントには詳しく紹介されていません.私の検索とテストを経て、やっとすべての関係がわかりました.
AutoMigrationはstruct tagに基づいて新しいテーブルを作成するだけで、ないカラムとインデックスは、既存のカラムのタイプを変更したり、使用していないカラムを削除したりしません.動的更新が必要な場合は、auto migrationの前の
gorm: primary_key設定キー not null非空拘束 size:64タイプサイズ、通常はvarchar を指す
以上は主にsizeとnot nullがドキュメントに現れていないので、他は例から見つけることができて、自分の意会です.
最近、書き込みテストでは、各ユニットのテストが実行時に自動的にデータベースを空にすることが望ましいことが明らかになった.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:
以上は主に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
}