Refactor columns matching method
This commit is contained in:
parent
21f7fcb853
commit
7b4c698e79
2 changed files with 106 additions and 12 deletions
|
@ -87,13 +87,25 @@ func (s *SQLiteDriver) DropColumns(tableName string, columnsToDrop []string) (sq
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
var indices []string
|
var oldIdxColumns [][]string
|
||||||
for _, idx := range oldSQLIndices {
|
for _, idx := range oldSQLIndices {
|
||||||
|
idxCols, err := fetchColumns(idx)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
oldIdxColumns = append(oldIdxColumns, idxCols)
|
||||||
|
}
|
||||||
|
|
||||||
|
var indices []string
|
||||||
|
for k, idx := range oldSQLIndices {
|
||||||
listed := false
|
listed := false
|
||||||
for _, cols := range columnsToDrop {
|
OIdxLoop:
|
||||||
if strings.Contains(idx, cols) {
|
for _, oidx := range oldIdxColumns[k] {
|
||||||
listed = true
|
for _, cols := range columnsToDrop {
|
||||||
break
|
if oidx == cols {
|
||||||
|
listed = true
|
||||||
|
break OIdxLoop
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if !listed {
|
if !listed {
|
||||||
|
@ -173,15 +185,27 @@ func (s *SQLiteDriver) RenameColumns(tableName string, columnChanges map[string]
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
var indices []string
|
var idxColumns [][]string
|
||||||
for _, idx := range oldSQLIndices {
|
for _, idx := range oldSQLIndices {
|
||||||
|
idxCols, err := fetchColumns(idx)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
idxColumns = append(idxColumns, idxCols)
|
||||||
|
}
|
||||||
|
|
||||||
|
var indices []string
|
||||||
|
for k, idx := range oldSQLIndices {
|
||||||
added := false
|
added := false
|
||||||
for Old, New := range columnChanges {
|
IdcLoop:
|
||||||
if strings.Contains(idx, Old) {
|
for _, oldIdx := range idxColumns[k] {
|
||||||
indx := strings.Replace(idx, Old, New, 2)
|
for Old, New := range columnChanges {
|
||||||
indices = append(indices, indx)
|
if oldIdx == Old {
|
||||||
added = true
|
indx := strings.Replace(idx, Old, New, 2)
|
||||||
break
|
indices = append(indices, indx)
|
||||||
|
added = true
|
||||||
|
break IdcLoop
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if !added {
|
if !added {
|
||||||
|
|
|
@ -3,6 +3,7 @@ package migrate
|
||||||
import (
|
import (
|
||||||
"database/sql"
|
"database/sql"
|
||||||
"os"
|
"os"
|
||||||
|
"strings"
|
||||||
"testing"
|
"testing"
|
||||||
|
|
||||||
"github.com/russross/meddler"
|
"github.com/russross/meddler"
|
||||||
|
@ -184,6 +185,51 @@ func (r *revision7) Revision() int64 {
|
||||||
|
|
||||||
// ---------- end of revision 7
|
// ---------- end of revision 7
|
||||||
|
|
||||||
|
// ---------- revision 8
|
||||||
|
type revision8 struct{}
|
||||||
|
|
||||||
|
func (r *revision8) Up(op Operation) error {
|
||||||
|
if _, err := op.AddColumn("samples", "repo_id INTEGER"); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
_, err := op.AddColumn("samples", "repo VARCHAR(255)")
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
func (r *revision8) Down(op Operation) error {
|
||||||
|
_, err := op.DropColumns("samples", []string{"repo", "repo_id"})
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
func (r *revision8) Revision() int64 {
|
||||||
|
return 8
|
||||||
|
}
|
||||||
|
|
||||||
|
// ---------- end of revision 8
|
||||||
|
|
||||||
|
// ---------- revision 9
|
||||||
|
type revision9 struct{}
|
||||||
|
|
||||||
|
func (r *revision9) Up(op Operation) error {
|
||||||
|
_, err := op.RenameColumns("samples", map[string]string{
|
||||||
|
"repo": "repository",
|
||||||
|
})
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
func (r *revision9) Down(op Operation) error {
|
||||||
|
_, err := op.RenameColumns("samples", map[string]string{
|
||||||
|
"repository": "repo",
|
||||||
|
})
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
func (r *revision9) Revision() int64 {
|
||||||
|
return 9
|
||||||
|
}
|
||||||
|
|
||||||
|
// ---------- end of revision 9
|
||||||
|
|
||||||
var db *sql.DB
|
var db *sql.DB
|
||||||
|
|
||||||
var testSchema = `
|
var testSchema = `
|
||||||
|
@ -430,6 +476,30 @@ func TestIndexOperations(t *testing.T) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestColumnRedundancy(t *testing.T) {
|
||||||
|
defer tearDown()
|
||||||
|
if err := setUp(); err != nil {
|
||||||
|
t.Fatalf("Error preparing database: %q", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
Driver = SQLite
|
||||||
|
|
||||||
|
migr := New(db)
|
||||||
|
if err := migr.Add(&revision1{}, &revision8{}, &revision9{}).Migrate(); err != nil {
|
||||||
|
t.Errorf("Can not migrate: %q", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
var tableSql string
|
||||||
|
query := `SELECT sql FROM sqlite_master where type='table' and name='samples'`
|
||||||
|
if err := db.QueryRow(query).Scan(&tableSql); err != nil {
|
||||||
|
t.Errorf("Can not query sqlite_master: %q", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
if !strings.Contains(tableSql, "repository ") {
|
||||||
|
t.Errorf("Expect column with name repository")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
func setUp() error {
|
func setUp() error {
|
||||||
var err error
|
var err error
|
||||||
db, err = sql.Open("sqlite3", "migration_tests.sqlite")
|
db, err = sql.Open("sqlite3", "migration_tests.sqlite")
|
||||||
|
|
Loading…
Reference in a new issue