postgres.go 1.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283
  1. package postgres
  2. import (
  3. "database/sql"
  4. "fmt"
  5. "github.com/jinzhu/gorm"
  6. "github.com/jinzhu/gorm/callbacks"
  7. "github.com/jinzhu/gorm/migrator"
  8. "github.com/jinzhu/gorm/schema"
  9. _ "github.com/lib/pq"
  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("postgres", dialector.DSN)
  21. return
  22. }
  23. func (dialector Dialector) Migrator(db *gorm.DB) gorm.Migrator {
  24. return Migrator{migrator.Migrator{Config: migrator.Config{
  25. DB: db,
  26. Dialector: dialector,
  27. }}}
  28. }
  29. func (dialector Dialector) BindVar(stmt *gorm.Statement, v interface{}) string {
  30. return "?"
  31. }
  32. func (dialector Dialector) QuoteChars() [2]byte {
  33. return [2]byte{'"', '"'} // "name"
  34. }
  35. func (dialector Dialector) DataTypeOf(field *schema.Field) string {
  36. switch field.DataType {
  37. case schema.Bool:
  38. return "boolean"
  39. case schema.Int, schema.Uint:
  40. if field.AutoIncrement {
  41. switch {
  42. case field.Size < 16:
  43. return "smallserial"
  44. case field.Size < 31:
  45. return "serial"
  46. default:
  47. return "bigserial"
  48. }
  49. } else {
  50. switch {
  51. case field.Size < 16:
  52. return "smallint"
  53. case field.Size < 31:
  54. return "integer"
  55. default:
  56. return "bigint"
  57. }
  58. }
  59. case schema.Float:
  60. return "decimal"
  61. case schema.String:
  62. if field.Size > 0 {
  63. return fmt.Sprintf("varchar(%d)", field.Size)
  64. }
  65. return "text"
  66. case schema.Time:
  67. return "timestamp with time zone"
  68. case schema.Bytes:
  69. return "bytea"
  70. }
  71. return ""
  72. }