gorm 执行删除 db 语句后无法重新创建
1. 运行环境
go 版本 : go version go1.17.2 darwin/amd64
mysql 版本 : 5.6.51
gorm 版本 : v1.22.5
2. 问题描述?
按照教程中的方法,进行 mysql db 的删除和重新创建
func deleteMysqlDatabase() error {
dbname := CurrentDatabase()
sql := fmt.Sprintf("DROP DATABASE %s;", dbname)
if err := DB.Exec(sql).Error; err != nil {
return err
}
sql = fmt.Sprintf("CREATE DATABASE %s;", dbname)
// SQLDB.Exec(sql)
if err := DB.Exec(sql).Error; err != nil {
return err
}
sql = fmt.Sprintf("USE %s;", dbname)
// SQLDB.Exec(sql)
if err := DB.Exec(sql).Error; err != nil {
return err
}
return nil
}
3. 您期望得到的结果?
期望的结果应该是跟教程里结果一样, DB重新删除然后创建,达到数据表全部删除的结果
4. 您实际得到的结果?
但我在实际执行过程中,遇到了 Unknown database 'gohub'
的错误
2022-01-27 23:29:33 DEBUG mysql/migrator.go:234 Database Query {"sql": "SELECT DATABASE()", "time": "7.211ms", "rows": -1}
2022-01-27 23:29:33 DEBUG mysql/migrator.go:237 Database Query {"sql": "SELECT SCHEMA_NAME from Information_schema.SCHEMATA where SCHEMA_NAME LIKE 'gohub%' ORDER BY SCHEMA_NAME='gohub' DESC limit 1", "time": "10.293ms", "rows": 1}
2022-01-27 23:29:33 DEBUG migrate/migrator.go:48 Database Query {"sql": "SELECT count(*) FROM information_schema.tables WHERE table_schema = 'gohub' AND table_name = 'migrations' AND table_type = 'BASE TABLE'", "time": "9.683ms", "rows": -1}
2022-01-27 23:29:33 DEBUG mysql/migrator.go:234 Database Query {"sql": "SELECT DATABASE()", "time": "5.028ms", "rows": -1}
2022-01-27 23:29:33 DEBUG mysql/migrator.go:237 Database Query {"sql": "SELECT SCHEMA_NAME from Information_schema.SCHEMATA where SCHEMA_NAME LIKE 'gohub%' ORDER BY SCHEMA_NAME='gohub' DESC limit 1", "time": "9.811ms", "rows": 1}
2022-01-27 23:29:33 DEBUG mysql/migrator.go:234 Database Query {"sql": "SELECT DATABASE()", "time": "8.330ms", "rows": -1}
2022-01-27 23:29:33 DEBUG mysql/migrator.go:237 Database Query {"sql": "SELECT SCHEMA_NAME from Information_schema.SCHEMATA where SCHEMA_NAME LIKE 'gohub%' ORDER BY SCHEMA_NAME='gohub' DESC limit 1", "time": "9.632ms", "rows": 1}
2022-01-27 23:29:33 DEBUG database/database.go:65 Database Query {"sql": "DROP DATABASE gohub;", "time": "41.058ms", "rows": 2}
2022-01-27 23:29:33 ERROR database/database.go:71 Database Error {"sql": "CREATE DATABASE gohub;", "time": "5.703ms", "rows": 0, "error": "Error 1049: Unknown database 'gohub'"}
gohub/pkg/database.deleteMysqlDatabase
/Users/lichmaker/go/src/github.com/lichmaker/gohub/pkg/database/database.go:71
gohub/pkg/database.DeleteAllTables
/Users/lichmaker/go/src/github.com/lichmaker/gohub/pkg/database/database.go:43
gohub/pkg/migrate.(*Migrator).Fresh
/Users/lichmaker/go/src/github.com/lichmaker/gohub/pkg/migrate/migrator.go:220
gohub/app/cmd.runFresh
/Users/lichmaker/go/src/github.com/lichmaker/gohub/app/cmd/migrate.go:82
github.com/spf13/cobra.(*Command).execute
/Users/lichmaker/go/src/github.com/lichmaker/gohub/vendor/github.com/spf13/cobra/command.go:860
github.com/spf13/cobra.(*Command).ExecuteC
/Users/lichmaker/go/src/github.com/lichmaker/gohub/vendor/github.com/spf13/cobra/command.go:974
github.com/spf13/cobra.(*Command).Execute
/Users/lichmaker/go/src/github.com/lichmaker/gohub/vendor/github.com/spf13/cobra/command.go:902
main.main
/Users/lichmaker/go/src/github.com/lichmaker/gohub/main.go:56
runtime.main
/usr/local/Cellar/go/1.17.2/libexec/src/runtime/proc.go:255
2022-01-27 23:29:33 DEBUG database/database.go:71 Database Query {"sql": "CREATE DATABASE gohub;", "time": "5.703ms", "rows": 0, "error": "Error 1049: Unknown database 'gohub'"}
Error 1049: Unknown database 'gohub'
exit status 1
我的理解是, 因为 DB
实际上是 *gorm.DB
,这里面的连接池是直接连接了 gohub
,所以在 db 删除后,连接池已经失效,所以无法执行 db 创建。
我直接使用 SQLDB
即 *sql.DB
来执行sql,是可以执行成功的。 所以应该是 gorm 的某个问题?
求大神解答。
推荐文章: