Fix wrong dbmetas #1442
@ -298,6 +298,40 @@ func splitColStr(colStr string) []string {
|
|||||||
return results
|
return results
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func parseString(colStr string) (*core.Column, error) {
|
||||||
|
fields := splitColStr(colStr)
|
||||||
|
col := new(core.Column)
|
||||||
|
col.Indexes = make(map[string]int)
|
||||||
|
col.Nullable = true
|
||||||
|
col.DefaultIsEmpty = true
|
||||||
|
|
||||||
|
for idx, field := range fields {
|
||||||
|
if idx == 0 {
|
||||||
|
col.Name = strings.Trim(strings.Trim(field, "`[] "), `"`)
|
||||||
|
continue
|
||||||
|
} else if idx == 1 {
|
||||||
|
col.SQLType = core.SQLType{Name: field, DefaultLength: 0, DefaultLength2: 0}
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
switch field {
|
||||||
|
case "PRIMARY":
|
||||||
|
col.IsPrimaryKey = true
|
||||||
|
case "AUTOINCREMENT":
|
||||||
|
col.IsAutoIncrement = true
|
||||||
|
case "NULL":
|
||||||
|
if fields[idx-1] == "NOT" {
|
||||||
|
col.Nullable = false
|
||||||
|
} else {
|
||||||
|
col.Nullable = true
|
||||||
|
}
|
||||||
|
case "DEFAULT":
|
||||||
|
col.Default = fields[idx+1]
|
||||||
|
col.DefaultIsEmpty = false
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return col, nil
|
||||||
|
}
|
||||||
|
|
||||||
func (db *sqlite3) GetColumns(tableName string) ([]string, map[string]*core.Column, error) {
|
func (db *sqlite3) GetColumns(tableName string) ([]string, map[string]*core.Column, error) {
|
||||||
args := []interface{}{tableName}
|
args := []interface{}{tableName}
|
||||||
s := "SELECT sql FROM sqlite_master WHERE type='table' and name = ?"
|
s := "SELECT sql FROM sqlite_master WHERE type='table' and name = ?"
|
||||||
@ -327,6 +361,7 @@ func (db *sqlite3) GetColumns(tableName string) ([]string, map[string]*core.Colu
|
|||||||
colCreates := reg.FindAllString(name[nStart+1:nEnd], -1)
|
colCreates := reg.FindAllString(name[nStart+1:nEnd], -1)
|
||||||
cols := make(map[string]*core.Column)
|
cols := make(map[string]*core.Column)
|
||||||
colSeq := make([]string, 0)
|
colSeq := make([]string, 0)
|
||||||
|
|
||||||
for _, colStr := range colCreates {
|
for _, colStr := range colCreates {
|
||||||
reg = regexp.MustCompile(`,\s`)
|
reg = regexp.MustCompile(`,\s`)
|
||||||
colStr = reg.ReplaceAllString(colStr, ",")
|
colStr = reg.ReplaceAllString(colStr, ",")
|
||||||
@ -343,35 +378,11 @@ func (db *sqlite3) GetColumns(tableName string) ([]string, map[string]*core.Colu
|
|||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
|
|
||||||
fields := splitColStr(colStr)
|
col, err := parseString(colStr)
|
||||||
col := new(core.Column)
|
if err != nil {
|
||||||
col.Indexes = make(map[string]int)
|
return colSeq, cols, err
|
||||||
col.Nullable = true
|
}
|
||||||
col.DefaultIsEmpty = true
|
|
||||||
|
|
||||||
for idx, field := range fields {
|
|
||||||
if idx == 0 {
|
|
||||||
col.Name = strings.Trim(strings.Trim(field, "`[] "), `"`)
|
|
||||||
continue
|
|
||||||
} else if idx == 1 {
|
|
||||||
col.SQLType = core.SQLType{Name: field, DefaultLength: 0, DefaultLength2: 0}
|
|
||||||
}
|
|
||||||
switch field {
|
|
||||||
case "PRIMARY":
|
|
||||||
col.IsPrimaryKey = true
|
|
||||||
case "AUTOINCREMENT":
|
|
||||||
col.IsAutoIncrement = true
|
|
||||||
case "NULL":
|
|
||||||
if fields[idx-1] == "NOT" {
|
|
||||||
col.Nullable = false
|
|
||||||
} else {
|
|
||||||
col.Nullable = true
|
|
||||||
}
|
|
||||||
case "DEFAULT":
|
|
||||||
col.Default = fields[idx+1]
|
|
||||||
col.DefaultIsEmpty = false
|
|
||||||
}
|
|
||||||
}
|
|
||||||
cols[col.Name] = col
|
cols[col.Name] = col
|
||||||
colSeq = append(colSeq, col.Name)
|
colSeq = append(colSeq, col.Name)
|
||||||
}
|
}
|
||||||
|
37
tag_test.go
37
tag_test.go
@ -560,16 +560,41 @@ func TestTagAutoIncr(t *testing.T) {
|
|||||||
|
|
||||||
assertSync(t, new(TagAutoIncr))
|
assertSync(t, new(TagAutoIncr))
|
||||||
|
|
||||||
mapper := testEngine.GetTableMapper()
|
tables, err := testEngine.DBMetas()
|
||||||
cmapper := testEngine.GetColumnMapper()
|
assert.NoError(t, err)
|
||||||
|
assert.EqualValues(t, 1, len(tables))
|
||||||
|
assert.EqualValues(t, tableMapper.Obj2Table("TagAutoIncr"), tables[0].Name)
|
||||||
|
col := tables[0].GetColumn(colMapper.Obj2Table("Id"))
|
||||||
|
assert.NotNil(t, col)
|
||||||
|
assert.True(t, col.IsPrimaryKey)
|
||||||
|
assert.True(t, col.IsAutoIncrement)
|
||||||
|
|
||||||
|
col2 := tables[0].GetColumn(colMapper.Obj2Table("Name"))
|
||||||
|
assert.NotNil(t, col2)
|
||||||
|
assert.False(t, col2.IsPrimaryKey)
|
||||||
|
assert.False(t, col2.IsAutoIncrement)
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestTagPrimarykey(t *testing.T) {
|
||||||
|
assert.NoError(t, prepareEngine())
|
||||||
|
type TagPrimaryKey struct {
|
||||||
|
Id int64 `xorm:"pk"`
|
||||||
|
Name string `xorm:"VARCHAR(20) pk"`
|
||||||
|
}
|
||||||
|
|
||||||
|
assertSync(t, new(TagPrimaryKey))
|
||||||
|
|
||||||
tables, err := testEngine.DBMetas()
|
tables, err := testEngine.DBMetas()
|
||||||
assert.NoError(t, err)
|
assert.NoError(t, err)
|
||||||
assert.EqualValues(t, 1, len(tables))
|
assert.EqualValues(t, 1, len(tables))
|
||||||
assert.EqualValues(t, mapper.Obj2Table("TagAutoIncr"), tables[0].Name)
|
assert.EqualValues(t, tableMapper.Obj2Table("TagPrimaryKey"), tables[0].Name)
|
||||||
col := tables[0].GetColumn(cmapper.Obj2Table("Name"))
|
col := tables[0].GetColumn(colMapper.Obj2Table("Id"))
|
||||||
assert.NotNil(t, col)
|
assert.NotNil(t, col)
|
||||||
assert.True(t, col.IsPrimaryKey)
|
assert.True(t, col.IsPrimaryKey)
|
||||||
assert.True(t, col.IsAutoIncrement)
|
assert.False(t, col.IsAutoIncrement)
|
||||||
assert.EqualValues(t, 255, col.SQLType.DefaultLength)
|
|
||||||
|
col2 := tables[0].GetColumn(colMapper.Obj2Table("Name"))
|
||||||
|
assert.NotNil(t, col2)
|
||||||
|
assert.True(t, col2.IsPrimaryKey)
|
||||||
|
assert.False(t, col2.IsAutoIncrement)
|
||||||
}
|
}
|
||||||
|
@ -15,10 +15,10 @@ import (
|
|||||||
|
|
||||||
_ "github.com/denisenkom/go-mssqldb"
|
_ "github.com/denisenkom/go-mssqldb"
|
||||||
_ "github.com/go-sql-driver/mysql"
|
_ "github.com/go-sql-driver/mysql"
|
||||||
"xorm.io/core"
|
|
||||||
_ "github.com/lib/pq"
|
_ "github.com/lib/pq"
|
||||||
_ "github.com/mattn/go-sqlite3"
|
_ "github.com/mattn/go-sqlite3"
|
||||||
_ "github.com/ziutek/mymysql/godrv"
|
_ "github.com/ziutek/mymysql/godrv"
|
||||||
|
"xorm.io/core"
|
||||||
)
|
)
|
||||||
|
|
||||||
var (
|
var (
|
||||||
@ -35,6 +35,9 @@ var (
|
|||||||
splitter = flag.String("splitter", ";", "the splitter on connstr for cluster")
|
splitter = flag.String("splitter", ";", "the splitter on connstr for cluster")
|
||||||
schema = flag.String("schema", "", "specify the schema")
|
schema = flag.String("schema", "", "specify the schema")
|
||||||
ignoreSelectUpdate = flag.Bool("ignore_select_update", false, "ignore select update if implementation difference, only for tidb")
|
ignoreSelectUpdate = flag.Bool("ignore_select_update", false, "ignore select update if implementation difference, only for tidb")
|
||||||
|
|
||||||
|
tableMapper core.IMapper
|
||||||
|
colMapper core.IMapper
|
||||||
)
|
)
|
||||||
|
|
||||||
func createEngine(dbType, connStr string) error {
|
func createEngine(dbType, connStr string) error {
|
||||||
@ -122,6 +125,9 @@ func createEngine(dbType, connStr string) error {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
tableMapper = testEngine.GetTableMapper()
|
||||||
|
colMapper = testEngine.GetColumnMapper()
|
||||||
|
|
||||||
tables, err := testEngine.DBMetas()
|
tables, err := testEngine.DBMetas()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
|
Loading…
Reference in New Issue
Block a user