check param and add comment

This commit is contained in:
black 2023-02-24 17:14:34 +08:00
parent 9567d5303d
commit b6000f5324
4 changed files with 34 additions and 5 deletions

View File

@ -23,6 +23,8 @@ var (
ErrModelValueRequired = errors.New("model value required")
// ErrModelAccessibleFieldsRequired model accessible fields required
ErrModelAccessibleFieldsRequired = errors.New("model accessible fields required")
// ErrSubQueryRequired sub query required
ErrSubQueryRequired = errors.New("sub query required")
// ErrInvalidData unsupported data
ErrInvalidData = errors.New("unsupported data")
// ErrUnsupportedDriver unsupported driver

View File

@ -30,9 +30,9 @@ func (db *DB) AutoMigrate(dst ...interface{}) error {
// ViewOption view option
type ViewOption struct {
Replace bool // CREATE [ OR REPLACE ]
CheckOption string // WITH [ CASCADED | LOCAL ] CHECK OPTION
Query *DB
Replace bool // If true, exec `CREATE`. If false, exec `CREATE OR REPLACE`
CheckOption string // optional. e.g. `WITH [ CASCADED | LOCAL ] CHECK OPTION`
Query *DB // required subquery.
}
// ColumnType column type interface

View File

@ -557,8 +557,23 @@ func (m Migrator) ColumnTypes(value interface{}) ([]gorm.ColumnType, error) {
return columnTypes, execErr
}
// CreateView create view
// CreateView create view from Query in gorm.ViewOption.
// Query in gorm.ViewOption is a [subquery]
//
// // CREATE VIEW `user_view` AS SELECT * FROM `users` WHERE age > 20
// q := DB.Model(&User{}).Where("age > ?", 20)
// DB.Debug().Migrator().CreateView("user_view", gorm.ViewOption{Query: q})
//
// // CREATE OR REPLACE VIEW `users_view` AS SELECT * FROM `users` WITH CHECK OPTION
// q := DB.Model(&User{})
// DB.Debug().Migrator().CreateView("user_view", gorm.ViewOption{Query: q, Replace: true, CheckOption: "WITH CHECK OPTION"})
//
// [subquery]: https://gorm.io/docs/advanced_query.html#SubQuery
func (m Migrator) CreateView(name string, option gorm.ViewOption) error {
if option.Query == nil {
return gorm.ErrSubQueryRequired
}
sql := new(strings.Builder)
sql.WriteString("CREATE ")
if option.Replace {
@ -574,7 +589,7 @@ func (m Migrator) CreateView(name string, option gorm.ViewOption) error {
sql.WriteString(" ")
sql.WriteString(option.CheckOption)
}
return m.DB.Exec(sql.String()).Error
return m.DB.Exec(m.Explain(sql.String(), m.DB.Statement.Vars...)).Error
}
// DropView drop view

View File

@ -1513,6 +1513,10 @@ func TestMigrateIgnoreRelations(t *testing.T) {
func TestMigrateView(t *testing.T) {
DB.Save(GetUser("joins-args-db", Config{Pets: 2}))
if err := DB.Migrator().CreateView("invalid_users_pets", gorm.ViewOption{Query: nil}); err != gorm.ErrSubQueryRequired {
t.Fatalf("no view should be created, got %v", err)
}
query := DB.Model(&User{}).
Select("users.id as users_id, users.name as users_name, pets.id as pets_id, pets.name as pets_name").
Joins("inner join pets on pets.user_id = users.id")
@ -1529,4 +1533,12 @@ func TestMigrateView(t *testing.T) {
if err := DB.Migrator().DropView("users_pets"); err != nil {
t.Fatalf("Failed to drop view, got %v", err)
}
query = DB.Model(&User{}).Where("age > ?", 20)
if err := DB.Migrator().CreateView("users_view", gorm.ViewOption{Query: query}); err != nil {
t.Fatalf("Failed to crate view, got %v", err)
}
if err := DB.Migrator().DropView("users_view"); err != nil {
t.Fatalf("Failed to drop view, got %v", err)
}
}