More work on sql schema and migrations, starting to get somewhere

This commit is contained in:
Torkel Ödegaard
2015-01-18 14:51:51 +01:00
parent 68a77c4051
commit 8bfed7508c
7 changed files with 220 additions and 104 deletions
+100 -32
View File
@@ -1,54 +1,122 @@
package migrations
type migration struct {
desc string
sqlite string
mysql string
verifyTable string
}
type columnType string
const (
DB_TYPE_STRING columnType = "String"
import (
"fmt"
"strings"
)
func (m *migration) getSql(dbType string) string {
switch dbType {
case "mysql":
const (
POSTGRES = "postgres"
SQLITE = "sqlite3"
MYSQL = "mysql"
)
type Migration interface {
Sql(dialect Dialect) string
}
type ColumnType string
const (
DB_TYPE_STRING ColumnType = "String"
)
type MigrationBase struct {
desc string
}
type RawSqlMigration struct {
MigrationBase
sqlite string
mysql string
}
func (m *RawSqlMigration) Sql(dialect Dialect) string {
switch dialect.DriverName() {
case MYSQL:
return m.mysql
case "sqlite3":
case SQLITE:
return m.sqlite
}
panic("db type not supported")
}
type migrationBuilder struct {
migration *migration
func (m *RawSqlMigration) Sqlite(sql string) *RawSqlMigration {
m.sqlite = sql
return m
}
func (b *migrationBuilder) sqlite(sql string) *migrationBuilder {
b.migration.sqlite = sql
return b
func (m *RawSqlMigration) Mysql(sql string) *RawSqlMigration {
m.mysql = sql
return m
}
func (b *migrationBuilder) mysql(sql string) *migrationBuilder {
b.migration.mysql = sql
return b
func (m *RawSqlMigration) Desc(desc string) *RawSqlMigration {
m.desc = desc
return m
}
func (b *migrationBuilder) verifyTable(name string) *migrationBuilder {
b.migration.verifyTable = name
return b
type AddColumnMigration struct {
MigrationBase
tableName string
columnName string
columnType ColumnType
length int
}
func (b *migrationBuilder) add() *migrationBuilder {
migrationList = append(migrationList, b.migration)
return b
func (m *AddColumnMigration) Table(tableName string) *AddColumnMigration {
m.tableName = tableName
return m
}
func (b *migrationBuilder) desc(desc string) *migrationBuilder {
b.migration = &migration{desc: desc}
return b
func (m *AddColumnMigration) Length(length int) *AddColumnMigration {
m.length = length
return m
}
func (m *AddColumnMigration) Column(columnName string) *AddColumnMigration {
m.columnName = columnName
return m
}
func (m *AddColumnMigration) Type(columnType ColumnType) *AddColumnMigration {
m.columnType = columnType
return m
}
func (m *AddColumnMigration) Sql(dialect Dialect) string {
return fmt.Sprintf("ALTER TABLE %s ADD COLUMN %s %s", m.tableName, m.columnName, dialect.ToDBTypeSql(m.columnType, m.length))
}
func (m *AddColumnMigration) Desc(desc string) *AddColumnMigration {
m.desc = desc
return m
}
type AddIndexMigration struct {
MigrationBase
tableName string
columns string
indexName string
}
func (m *AddIndexMigration) Name(name string) *AddIndexMigration {
m.indexName = name
return m
}
func (m *AddIndexMigration) Table(tableName string) *AddIndexMigration {
m.tableName = tableName
return m
}
func (m *AddIndexMigration) Columns(columns ...string) *AddIndexMigration {
m.columns = strings.Join(columns, ",")
return m
}
func (m *AddIndexMigration) Sql(dialect Dialect) string {
return fmt.Sprintf("CREATE UNIQUE INDEX %s ON %s(%s)", m.indexName, m.tableName, m.columns)
}