forked from mirror/gorm
When multiple databases have the same table name and column names, automigrate doesn't work
This commit is contained in:
parent
fd3ce3b39a
commit
1ff3c79c75
5
main.go
5
main.go
|
@ -2,7 +2,6 @@ package gorm
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"database/sql"
|
"database/sql"
|
||||||
|
|
||||||
"github.com/jinzhu/gorm/dialect"
|
"github.com/jinzhu/gorm/dialect"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
@ -18,11 +17,13 @@ type DB struct {
|
||||||
dialect dialect.Dialect
|
dialect dialect.Dialect
|
||||||
tagIdentifier string
|
tagIdentifier string
|
||||||
singularTable bool
|
singularTable bool
|
||||||
|
source string
|
||||||
}
|
}
|
||||||
|
|
||||||
func Open(driver, source string) (DB, error) {
|
func Open(driver, source string) (DB, error) {
|
||||||
var err error
|
var err error
|
||||||
db := DB{dialect: dialect.New(driver), tagIdentifier: "sql", logger: defaultLogger, callback: DefaultCallback}
|
|
||||||
|
db := DB{dialect: dialect.New(driver), tagIdentifier: "sql", logger: defaultLogger, callback: DefaultCallback, source: source}
|
||||||
db.db, err = sql.Open(driver, source)
|
db.db, err = sql.Open(driver, source)
|
||||||
db.parent = &db
|
db.parent = &db
|
||||||
return db, err
|
return db, err
|
||||||
|
|
|
@ -6,7 +6,7 @@ import (
|
||||||
)
|
)
|
||||||
|
|
||||||
func (s *DB) clone() *DB {
|
func (s *DB) clone() *DB {
|
||||||
db := DB{db: s.db, parent: s.parent, logMode: s.logMode, Value: s.Value, Error: s.Error}
|
db := DB{db: s.db, parent: s.parent, logMode: s.logMode, Value: s.Value, Error: s.Error, source: s.source}
|
||||||
|
|
||||||
if s.search == nil {
|
if s.search == nil {
|
||||||
db.search = &search{}
|
db.search = &search{}
|
||||||
|
|
|
@ -447,8 +447,18 @@ func (scope *Scope) removeIndex(indexName string) {
|
||||||
}
|
}
|
||||||
|
|
||||||
func (scope *Scope) autoMigrate() *Scope {
|
func (scope *Scope) autoMigrate() *Scope {
|
||||||
|
// scope.db.source sample: root:@/testdatabase?parseTime=true
|
||||||
|
from := strings.Index(scope.db.source, "/")
|
||||||
|
to := strings.Index(scope.db.source, "?")
|
||||||
|
if to == -1 {
|
||||||
|
to = len(scope.db.source)
|
||||||
|
}
|
||||||
|
databaseName := scope.db.source[from:to]
|
||||||
|
|
||||||
var tableName string
|
var tableName string
|
||||||
scope.Raw(fmt.Sprintf("SELECT table_name FROM INFORMATION_SCHEMA.tables where table_name = %v", scope.AddToVars(scope.TableName())))
|
scope.Raw(fmt.Sprintf("SELECT table_name FROM INFORMATION_SCHEMA.tables where table_schema = %v AND table_name = %v",
|
||||||
|
scope.AddToVars(databaseName),
|
||||||
|
scope.AddToVars(scope.TableName())))
|
||||||
scope.DB().QueryRow(scope.Sql, scope.SqlVars...).Scan(&tableName)
|
scope.DB().QueryRow(scope.Sql, scope.SqlVars...).Scan(&tableName)
|
||||||
scope.SqlVars = []interface{}{}
|
scope.SqlVars = []interface{}{}
|
||||||
|
|
||||||
|
@ -458,7 +468,8 @@ func (scope *Scope) autoMigrate() *Scope {
|
||||||
} else {
|
} else {
|
||||||
for _, field := range scope.Fields() {
|
for _, field := range scope.Fields() {
|
||||||
var column, data string
|
var column, data string
|
||||||
scope.Raw(fmt.Sprintf("SELECT column_name, data_type FROM information_schema.columns WHERE table_name = %v and column_name = %v",
|
scope.Raw(fmt.Sprintf("SELECT column_name, data_type FROM information_schema.columns WHERE table_schema = %v AND table_name = %v AND column_name = %v",
|
||||||
|
scope.AddToVars(databaseName),
|
||||||
scope.AddToVars(scope.TableName()),
|
scope.AddToVars(scope.TableName()),
|
||||||
scope.AddToVars(field.DBName),
|
scope.AddToVars(field.DBName),
|
||||||
))
|
))
|
||||||
|
|
Loading…
Reference in New Issue