108 lines
2.2 KiB
Go
108 lines
2.2 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 := "Cartografia"
|
|
table := "MANZANA"
|
|
|
|
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,
|
|
CASE WHEN t.is_user_defined = 0 THEN t.name ELSE bt.name END AS system_type_name,
|
|
c.max_length AS max_length,
|
|
c.precision AS precision,
|
|
c.scale AS scale,
|
|
c.is_nullable AS is_nullable,
|
|
c.is_identity AS is_identity
|
|
FROM sys.columns c
|
|
JOIN sys.types t ON c.user_type_id = t.user_type_id
|
|
LEFT JOIN sys.types bt ON t.is_user_defined = 1 AND bt.user_type_id = t.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
|
|
}
|