check param and add comment
This commit is contained in:
		
							parent
							
								
									9567d5303d
								
							
						
					
					
						commit
						b6000f5324
					
				@ -23,6 +23,8 @@ var (
 | 
				
			|||||||
	ErrModelValueRequired = errors.New("model value required")
 | 
						ErrModelValueRequired = errors.New("model value required")
 | 
				
			||||||
	// ErrModelAccessibleFieldsRequired model accessible fields required
 | 
						// ErrModelAccessibleFieldsRequired model accessible fields required
 | 
				
			||||||
	ErrModelAccessibleFieldsRequired = errors.New("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 unsupported data
 | 
				
			||||||
	ErrInvalidData = errors.New("unsupported data")
 | 
						ErrInvalidData = errors.New("unsupported data")
 | 
				
			||||||
	// ErrUnsupportedDriver unsupported driver
 | 
						// ErrUnsupportedDriver unsupported driver
 | 
				
			||||||
 | 
				
			|||||||
@ -30,9 +30,9 @@ func (db *DB) AutoMigrate(dst ...interface{}) error {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
// ViewOption view option
 | 
					// ViewOption view option
 | 
				
			||||||
type ViewOption struct {
 | 
					type ViewOption struct {
 | 
				
			||||||
	Replace     bool   // CREATE [ OR REPLACE ]
 | 
						Replace     bool   // If true, exec `CREATE`. If false, exec `CREATE OR REPLACE`
 | 
				
			||||||
	CheckOption string // WITH [ CASCADED | LOCAL ] CHECK OPTION
 | 
						CheckOption string // optional. e.g. `WITH [ CASCADED | LOCAL ] CHECK OPTION`
 | 
				
			||||||
	Query       *DB
 | 
						Query       *DB    // required subquery.
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// ColumnType column type interface
 | 
					// ColumnType column type interface
 | 
				
			||||||
 | 
				
			|||||||
@ -557,8 +557,23 @@ func (m Migrator) ColumnTypes(value interface{}) ([]gorm.ColumnType, error) {
 | 
				
			|||||||
	return columnTypes, execErr
 | 
						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 {
 | 
					func (m Migrator) CreateView(name string, option gorm.ViewOption) error {
 | 
				
			||||||
 | 
						if option.Query == nil {
 | 
				
			||||||
 | 
							return gorm.ErrSubQueryRequired
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	sql := new(strings.Builder)
 | 
						sql := new(strings.Builder)
 | 
				
			||||||
	sql.WriteString("CREATE ")
 | 
						sql.WriteString("CREATE ")
 | 
				
			||||||
	if option.Replace {
 | 
						if option.Replace {
 | 
				
			||||||
@ -574,7 +589,7 @@ func (m Migrator) CreateView(name string, option gorm.ViewOption) error {
 | 
				
			|||||||
		sql.WriteString(" ")
 | 
							sql.WriteString(" ")
 | 
				
			||||||
		sql.WriteString(option.CheckOption)
 | 
							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
 | 
					// DropView drop view
 | 
				
			||||||
 | 
				
			|||||||
@ -1513,6 +1513,10 @@ func TestMigrateIgnoreRelations(t *testing.T) {
 | 
				
			|||||||
func TestMigrateView(t *testing.T) {
 | 
					func TestMigrateView(t *testing.T) {
 | 
				
			||||||
	DB.Save(GetUser("joins-args-db", Config{Pets: 2}))
 | 
						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{}).
 | 
						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").
 | 
							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")
 | 
							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 {
 | 
						if err := DB.Migrator().DropView("users_pets"); err != nil {
 | 
				
			||||||
		t.Fatalf("Failed to drop view, got %v", err)
 | 
							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)
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user