sqlite3.go 2.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485
  1. package gorm
  2. import (
  3. "fmt"
  4. "reflect"
  5. )
  6. type sqlite3 struct{}
  7. func (s *sqlite3) BinVar(i int) string {
  8. return "$$" // ?
  9. }
  10. func (s *sqlite3) SupportLastInsertId() bool {
  11. return true
  12. }
  13. func (s *sqlite3) HasTop() bool {
  14. return false
  15. }
  16. func (s *sqlite3) SqlTag(value reflect.Value, size int) string {
  17. switch value.Kind() {
  18. case reflect.Bool:
  19. return "bool"
  20. case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uintptr:
  21. return "integer"
  22. case reflect.Int64, reflect.Uint64:
  23. return "bigint"
  24. case reflect.Float32, reflect.Float64:
  25. return "real"
  26. case reflect.String:
  27. if size > 0 && size < 65532 {
  28. return fmt.Sprintf("varchar(%d)", size)
  29. } else {
  30. return "text"
  31. }
  32. case reflect.Struct:
  33. if value.Type() == timeType {
  34. return "datetime"
  35. }
  36. default:
  37. if _, ok := value.Interface().([]byte); ok {
  38. return "blob"
  39. }
  40. }
  41. panic(fmt.Sprintf("invalid sql type %s (%s) for sqlite3", value.Type().Name(), value.Kind().String()))
  42. }
  43. func (s *sqlite3) PrimaryKeyTag(value reflect.Value, size int) string {
  44. switch value.Kind() {
  45. case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uintptr, reflect.Int64, reflect.Uint64:
  46. return "INTEGER PRIMARY KEY"
  47. default:
  48. panic("Invalid primary key type")
  49. }
  50. }
  51. func (s *sqlite3) ReturningStr(tableName, key string) string {
  52. return ""
  53. }
  54. func (s *sqlite3) SelectFromDummyTable() string {
  55. return ""
  56. }
  57. func (s *sqlite3) Quote(key string) string {
  58. return fmt.Sprintf("\"%s\"", key)
  59. }
  60. func (s *sqlite3) HasTable(scope *Scope, tableName string) bool {
  61. var count int
  62. scope.DB().QueryRow(fmt.Sprintf("SELECT count(*) FROM sqlite_master WHERE type='table' AND name='%v';", tableName)).Scan(&count)
  63. return count > 0
  64. }
  65. func (s *sqlite3) HasColumn(scope *Scope, tableName string, columnName string) bool {
  66. var count int
  67. scope.DB().QueryRow(fmt.Sprintf("SELECT count(*) FROM sqlite_master WHERE tbl_name = '%v' AND (sql LIKE '%%(\"%v\" %%' OR sql LIKE '%%,\"%v\" %%' OR sql LIKE '%%( %v %%' OR sql LIKE '%%, %v %%');\n", tableName, columnName, columnName, columnName, columnName)).Scan(&count)
  68. return count > 0
  69. }
  70. func (s *sqlite3) RemoveIndex(scope *Scope, indexName string) {
  71. scope.Raw(fmt.Sprintf("DROP INDEX %v", indexName)).Exec()
  72. }