mssql.go 1.5 KB

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