Files
go-migrate/scripts/mssql-info-test/main.go

108 lines
2.1 KiB
Go

package main
import (
"database/sql"
"time"
"git.ksdemosapps.com/kylesoda/go-migrate/internal/app/config"
_ "github.com/microsoft/go-mssqldb"
log "github.com/sirupsen/logrus"
)
func main() {
log.SetFormatter(&log.TextFormatter{
FullTimestamp: true,
TimestampFormat: time.StampMilli,
})
log.SetLevel(log.DebugLevel)
db, err := sql.Open("sqlserver", config.App.SourceDbUrl)
if err != nil {
log.Fatal("Unexpected error connecting to mssql", err)
}
log.Debug(config.App.SourceDbUrl)
if err := db.Ping(); err != nil {
log.Fatal("Couldn't ping mssql db", err)
}
schema := "test"
table := "migration_test"
columns, err := getTableMetadata(db, schema, table)
if err != nil {
log.Fatal("Unexpected error extracting table info", err)
}
log.Info("Table info:")
for _, c := range columns {
log.Infof("%+v", c)
}
}
type ColumnInfo struct {
Name string
UserDataType string
SystemDataType string
MaxLength int16
Precision uint8
Scale uint8
Nullable bool
IsIdentity bool
}
func getTableMetadata(db *sql.DB, schema, table string) ([]ColumnInfo, error) {
query := `
SELECT
c.name AS column_name,
t.name AS user_type_name,
bt.name AS system_type_name,
c.max_length,
c.precision,
c.scale,
c.is_nullable,
c.is_identity
FROM sys.columns c
JOIN sys.types t ON c.user_type_id = t.user_type_id
JOIN sys.types bt ON c.system_type_id = bt.system_type_id AND bt.user_type_id = bt.system_type_id
JOIN sys.tables st ON c.object_id = st.object_id
JOIN sys.schemas s ON st.schema_id = s.schema_id
WHERE s.name = @schema AND st.name = @table
ORDER BY c.column_id;`
rows, err := db.Query(query, sql.Named("schema", schema), sql.Named("table", table))
if err != nil {
log.Warn(err)
return nil, err
}
defer rows.Close()
var columns []ColumnInfo
for rows.Next() {
var c ColumnInfo
err := rows.Scan(
&c.Name,
&c.UserDataType,
&c.SystemDataType,
&c.MaxLength,
&c.Precision,
&c.Scale,
&c.Nullable,
&c.IsIdentity,
)
if err != nil {
log.Warn(err)
return nil, err
}
columns = append(columns, c)
}
return columns, nil
}