From 2f228b606c93c7dedfe2e7b7237c506a196cd3e0 Mon Sep 17 00:00:00 2001 From: black Date: Thu, 23 Feb 2023 18:24:23 +0800 Subject: [PATCH] create view --- migrator/migrator.go | 20 ++++++++++++++++++-- tests/migrate_test.go | 21 +++++++++++++++++++++ 2 files changed, 39 insertions(+), 2 deletions(-) diff --git a/migrator/migrator.go b/migrator/migrator.go index 12c2df46..47fd300c 100644 --- a/migrator/migrator.go +++ b/migrator/migrator.go @@ -559,12 +559,28 @@ func (m Migrator) ColumnTypes(value interface{}) ([]gorm.ColumnType, error) { // CreateView create view func (m Migrator) CreateView(name string, option gorm.ViewOption) error { - return gorm.ErrNotImplemented + sql := new(strings.Builder) + sql.WriteString("CREATE ") + if option.Replace { + sql.WriteString("OR REPLACE ") + } + sql.WriteString("VIEW ") + m.QuoteTo(sql, name) + sql.WriteString(" AS ") + + m.DB.Statement.AddVar(sql, option.Query) + + if option.CheckOption != "" { + sql.WriteString(" WITH ") + sql.WriteString(option.CheckOption) + sql.WriteString(" CHECK OPTION") + } + return m.DB.Exec(sql.String()).Error } // DropView drop view func (m Migrator) DropView(name string) error { - return gorm.ErrNotImplemented + return m.DB.Exec("DROP VIEW IF EXISTS ?", clause.Table{Name: name}).Error } func buildConstraint(constraint *schema.Constraint) (sql string, results []interface{}) { diff --git a/tests/migrate_test.go b/tests/migrate_test.go index 5a220ca4..992fdd95 100644 --- a/tests/migrate_test.go +++ b/tests/migrate_test.go @@ -644,6 +644,27 @@ func TestMigrateColumns(t *testing.T) { } } +func TestMigrateView(t *testing.T) { + DB.Save(GetUser("joins-args-db", Config{Pets: 2})) + + 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") + + if err := DB.Migrator().CreateView("users_pets", gorm.ViewOption{Query: query}); err != nil { + t.Fatalf("Failed to crate view, got %v", err) + } + + var count int64 + if err := DB.Table("users_pets").Count(&count).Error; err != nil { + t.Fatalf("should found created view") + } + + if err := DB.Migrator().DropView("users_pets"); err != nil { + t.Fatalf("Failed to drop view, got %v", err) + } +} + func TestMigrateConstraint(t *testing.T) { names := []string{"Account", "fk_users_account", "Pets", "fk_users_pets", "Company", "fk_users_company", "Team", "fk_users_team", "Languages", "fk_users_languages"}