Browse Source

添加表配置

fancl 2 years ago
parent
commit
335677413a
3 changed files with 46 additions and 16 deletions
  1. 39 14
      config.go
  2. 5 1
      crud.go
  3. 2 1
      schema.go

+ 39 - 14
config.go

@@ -1,35 +1,60 @@
 package rest
 
-import "fmt"
+import (
+	"fmt"
+	"net/url"
+	"strings"
+)
 
 type Config struct {
-	Driver   string `json:"driver"`
-	Filename string `json:"filename"`
-	Host     string `json:"host"`
-	Port     int    `json:"port"`
-	Username string `json:"username"`
-	Password string `json:"password"`
-	Database string `json:"database"`
+	Driver   string            `json:"driver"`
+	Filename string            `json:"filename"`
+	Host     string            `json:"host"`
+	Port     int               `json:"port"`
+	Username string            `json:"username"`
+	Password string            `json:"password"`
+	Database string            `json:"database"`
+	Params   map[string]string `json:"params"`
 }
 
-
-func (cfg Config) ParseDSN() string {
+func (cfg *Config) ParseDSN() string {
 	if cfg.Driver == "sqlite3" {
 		return cfg.Filename
 	} else if cfg.Driver == "mysql" {
-		return fmt.Sprintf("%s:%s@tcp(%s:%d)/%s?charset=utf8&parseTime=True&loc=Local",
+		ps := map[string]string{
+			"charset":   "utf8",
+			"parseTime": "True",
+			"loc":       "Local",
+		}
+		if cfg.Params != nil {
+			for k, v := range cfg.Params {
+				ps[k] = v
+			}
+		}
+		u := url.Values{}
+		for k, v := range ps {
+			u.Set(k, v)
+		}
+		return fmt.Sprintf("%s:%s@tcp(%s:%d)/%s?",
 			cfg.Username,
 			cfg.Password,
 			cfg.Host,
 			cfg.Port,
-			cfg.Database)
+			cfg.Database) + u.Encode()
 	} else if cfg.Driver == "postgres" {
+		var s string
+		if cfg.Params != nil {
+			for k, v := range cfg.Params {
+				s += k + "=" + v + " "
+			}
+		}
+		s = strings.TrimRight(s, " ")
 		return fmt.Sprintf("host=%s port=%d user=%s dbname=%s password=%s",
 			cfg.Host,
 			cfg.Port,
 			cfg.Username,
 			cfg.Database,
-			cfg.Password)
+			cfg.Password) + s
 	}
 	return ""
-}
+}

+ 5 - 1
crud.go

@@ -236,7 +236,11 @@ func (crud *CRUD) Attach(model Model, ops ...Option) (err error) {
 		opts.DB = crud.db
 	}
 	//auto migrate database struct
-	if err = crud.db.AutoMigrate(model); err != nil {
+	tx := opts.DB.Session(&gorm.Session{NewDB: true})
+	if opts.MigrateOptions != nil && opts.MigrateOptions.TableOptions != "" {
+		tx.Set("gorm:table_options", opts.MigrateOptions.TableOptions)
+	}
+	if err = tx.AutoMigrate(model); err != nil {
 		return
 	}
 	//migrate table schema

+ 2 - 1
schema.go

@@ -46,7 +46,8 @@ const (
 
 type (
 	MigrateOptions struct {
-		Callback func(schema *Schema) (err error)
+		TableOptions string
+		Callback     func(schema *Schema) (err error)
 	}
 
 	MigrateOption func(o *MigrateOptions)