migrator.go 1.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748
  1. package mssql
  2. import (
  3. "github.com/jinzhu/gorm"
  4. "github.com/jinzhu/gorm/migrator"
  5. )
  6. type Migrator struct {
  7. migrator.Migrator
  8. }
  9. func (m Migrator) HasTable(value interface{}) bool {
  10. var count int
  11. m.RunWithValue(value, func(stmt *gorm.Statement) error {
  12. return m.DB.Raw(
  13. "SELECT count(*) FROM INFORMATION_SCHEMA.tables WHERE table_name = ? AND table_catalog = ?",
  14. stmt.Table, m.CurrentDatabase(),
  15. ).Row().Scan(&count)
  16. })
  17. return count > 0
  18. }
  19. func (m Migrator) HasIndex(value interface{}, name string) bool {
  20. var count int
  21. m.RunWithValue(value, func(stmt *gorm.Statement) error {
  22. return m.DB.Raw(
  23. "SELECT count(*) FROM sys.indexes WHERE name=? AND object_id=OBJECT_ID(?)",
  24. name, stmt.Table,
  25. ).Row().Scan(&count)
  26. })
  27. return count > 0
  28. }
  29. func (m Migrator) HasConstraint(value interface{}, name string) bool {
  30. var count int64
  31. m.RunWithValue(value, func(stmt *gorm.Statement) error {
  32. return m.DB.Raw(
  33. `SELECT count(*) FROM sys.foreign_keys as F inner join sys.tables as T on F.parent_object_id=T.object_id inner join information_schema.tables as I on I.TABLE_NAME = T.name WHERE F.name = ? AND T.Name = ? AND I.TABLE_CATALOG = ?;`,
  34. name, stmt.Table, m.CurrentDatabase(),
  35. ).Row().Scan(&count)
  36. })
  37. return count > 0
  38. }
  39. func (m Migrator) CurrentDatabase() (name string) {
  40. m.DB.Raw("SELECT DB_NAME() AS [Current Database]").Row().Scan(&name)
  41. return
  42. }