sqlite.go 1.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869
  1. package sqlite
  2. import (
  3. "database/sql"
  4. "github.com/jinzhu/gorm"
  5. "github.com/jinzhu/gorm/callbacks"
  6. "github.com/jinzhu/gorm/logger"
  7. "github.com/jinzhu/gorm/migrator"
  8. "github.com/jinzhu/gorm/schema"
  9. _ "github.com/mattn/go-sqlite3"
  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("sqlite3", 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. CreateIndexAfterCreateTable: true,
  28. }}}
  29. }
  30. func (dialector Dialector) BindVar(stmt *gorm.Statement, v interface{}) string {
  31. return "?"
  32. }
  33. func (dialector Dialector) QuoteChars() [2]byte {
  34. return [2]byte{'`', '`'} // `name`
  35. }
  36. func (dialector Dialector) Explain(sql string, vars ...interface{}) string {
  37. return logger.ExplainSQL(sql, nil, `"`, vars...)
  38. }
  39. func (dialector Dialector) DataTypeOf(field *schema.Field) string {
  40. switch field.DataType {
  41. case schema.Bool:
  42. return "numeric"
  43. case schema.Int, schema.Uint:
  44. if field.AutoIncrement {
  45. // https://www.sqlite.org/autoinc.html
  46. return "integer PRIMARY KEY AUTOINCREMENT"
  47. } else {
  48. return "integer"
  49. }
  50. case schema.Float:
  51. return "real"
  52. case schema.String, schema.Time:
  53. return "text"
  54. case schema.Bytes:
  55. return "blob"
  56. }
  57. return ""
  58. }