mssql.go 1.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384
  1. package mssql
  2. import (
  3. "database/sql"
  4. "fmt"
  5. "strconv"
  6. _ "github.com/denisenkom/go-mssqldb"
  7. "github.com/jinzhu/gorm"
  8. "github.com/jinzhu/gorm/callbacks"
  9. "github.com/jinzhu/gorm/migrator"
  10. "github.com/jinzhu/gorm/schema"
  11. )
  12. type Dialector struct {
  13. DSN string
  14. }
  15. func Open(dsn string) gorm.Dialector {
  16. return &Dialector{DSN: dsn}
  17. }
  18. func (dialector Dialector) Initialize(db *gorm.DB) (err error) {
  19. // register callbacks
  20. callbacks.RegisterDefaultCallbacks(db)
  21. db.DB, err = sql.Open("sqlserver", dialector.DSN)
  22. return
  23. }
  24. func (dialector Dialector) Migrator(db *gorm.DB) gorm.Migrator {
  25. return Migrator{migrator.Migrator{Config: migrator.Config{
  26. DB: db,
  27. Dialector: dialector,
  28. CreateIndexAfterCreateTable: true,
  29. }}}
  30. }
  31. func (dialector Dialector) BindVar(stmt *gorm.Statement, v interface{}) string {
  32. return "@p" + strconv.Itoa(len(stmt.Vars))
  33. }
  34. func (dialector Dialector) QuoteChars() [2]byte {
  35. return [2]byte{'"', '"'} // `name`
  36. }
  37. func (dialector Dialector) DataTypeOf(field *schema.Field) string {
  38. switch field.DataType {
  39. case schema.Bool:
  40. return "bit"
  41. case schema.Int, schema.Uint:
  42. var sqlType string
  43. switch {
  44. case field.Size < 16:
  45. sqlType = "smallint"
  46. case field.Size < 31:
  47. sqlType = "int"
  48. default:
  49. sqlType = "bigint"
  50. }
  51. if field.AutoIncrement {
  52. return sqlType + " IDENTITY(1,1)"
  53. }
  54. return sqlType
  55. case schema.Float:
  56. return "decimal"
  57. case schema.String:
  58. size := field.Size
  59. if field.PrimaryKey && size == 0 {
  60. size = 256
  61. }
  62. if size > 0 && size <= 4000 {
  63. return fmt.Sprintf("nvarchar(%d)", size)
  64. }
  65. return "ntext"
  66. case schema.Time:
  67. return "datetimeoffset"
  68. case schema.Bytes:
  69. return "binary"
  70. }
  71. return ""
  72. }