forked from mirror/gorm
add gorm ColumnType interface, remove sql one (#3647)
This commit is contained in:
parent
bdb30da0a7
commit
635dcc9ad4
14
migrator.go
14
migrator.go
|
@ -1,8 +1,6 @@
|
|||
package gorm
|
||||
|
||||
import (
|
||||
"database/sql"
|
||||
|
||||
"gorm.io/gorm/clause"
|
||||
"gorm.io/gorm/schema"
|
||||
)
|
||||
|
@ -24,6 +22,14 @@ type ViewOption struct {
|
|||
Query *DB
|
||||
}
|
||||
|
||||
type ColumnType interface {
|
||||
Name() string
|
||||
DatabaseTypeName() string
|
||||
Length() (length int64, ok bool)
|
||||
DecimalSize() (precision int64, scale int64, ok bool)
|
||||
Nullable() (nullable bool, ok bool)
|
||||
}
|
||||
|
||||
type Migrator interface {
|
||||
// AutoMigrate
|
||||
AutoMigrate(dst ...interface{}) error
|
||||
|
@ -42,10 +48,10 @@ type Migrator interface {
|
|||
AddColumn(dst interface{}, field string) error
|
||||
DropColumn(dst interface{}, field string) error
|
||||
AlterColumn(dst interface{}, field string) error
|
||||
MigrateColumn(dst interface{}, field *schema.Field, columnType *sql.ColumnType) error
|
||||
MigrateColumn(dst interface{}, field *schema.Field, columnType ColumnType) error
|
||||
HasColumn(dst interface{}, field string) bool
|
||||
RenameColumn(dst interface{}, oldName, field string) error
|
||||
ColumnTypes(dst interface{}) ([]*sql.ColumnType, error)
|
||||
ColumnTypes(dst interface{}) ([]ColumnType, error)
|
||||
|
||||
// Views
|
||||
CreateView(name string, option ViewOption) error
|
||||
|
|
|
@ -2,7 +2,6 @@ package migrator
|
|||
|
||||
import (
|
||||
"context"
|
||||
"database/sql"
|
||||
"fmt"
|
||||
"reflect"
|
||||
"regexp"
|
||||
|
@ -92,7 +91,7 @@ func (m Migrator) AutoMigrate(values ...interface{}) error {
|
|||
columnTypes, _ := m.DB.Migrator().ColumnTypes(value)
|
||||
|
||||
for _, field := range stmt.Schema.FieldsByDBName {
|
||||
var foundColumn *sql.ColumnType
|
||||
var foundColumn gorm.ColumnType
|
||||
|
||||
for _, columnType := range columnTypes {
|
||||
if columnType.Name() == field.DBName {
|
||||
|
@ -352,7 +351,7 @@ func (m Migrator) RenameColumn(value interface{}, oldName, newName string) error
|
|||
})
|
||||
}
|
||||
|
||||
func (m Migrator) MigrateColumn(value interface{}, field *schema.Field, columnType *sql.ColumnType) error {
|
||||
func (m Migrator) MigrateColumn(value interface{}, field *schema.Field, columnType gorm.ColumnType) error {
|
||||
// found, smart migrate
|
||||
fullDataType := strings.ToLower(m.DB.Migrator().FullDataTypeOf(field).SQL)
|
||||
realDataType := strings.ToLower(columnType.DatabaseTypeName())
|
||||
|
@ -395,12 +394,18 @@ func (m Migrator) MigrateColumn(value interface{}, field *schema.Field, columnTy
|
|||
return nil
|
||||
}
|
||||
|
||||
func (m Migrator) ColumnTypes(value interface{}) (columnTypes []*sql.ColumnType, err error) {
|
||||
func (m Migrator) ColumnTypes(value interface{}) (columnTypes []gorm.ColumnType, err error) {
|
||||
columnTypes = make([]gorm.ColumnType, 0)
|
||||
err = m.RunWithValue(value, func(stmt *gorm.Statement) error {
|
||||
rows, err := m.DB.Session(&gorm.Session{}).Table(stmt.Table).Limit(1).Rows()
|
||||
if err == nil {
|
||||
defer rows.Close()
|
||||
columnTypes, err = rows.ColumnTypes()
|
||||
rawColumnTypes, err := rows.ColumnTypes()
|
||||
if err == nil {
|
||||
for _, c := range rawColumnTypes {
|
||||
columnTypes = append(columnTypes, c)
|
||||
}
|
||||
}
|
||||
}
|
||||
return err
|
||||
})
|
||||
|
|
Loading…
Reference in New Issue