package main import ( "context" "database/sql" "fmt" "strings" "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) } ctx := context.Background() schema := "Cartografia" table := "MANZANA" query := buildExtractSqlSentence(schema, table, []string{}) rows, err := db.QueryContext(ctx, query) if err != nil { log.Fatal("Unexpected error extracting data", err) } defer rows.Close() cols, _ := rows.Columns() values := make([]any, len(cols)) scanArgs := make([]any, len(cols)) for i := range values { scanArgs[i] = &values[i] } colTypes, err := rows.ColumnTypes() if err != nil { log.Fatal(err) } for _, col := range colTypes { log.Debugf("%+v", col) } count := 0 for rows.Next() { if err := rows.Scan(scanArgs...); err != nil { log.Fatal("Error scan", err) } count++ if count%100000 == 0 { log.Infof("Procesadas %d filas...\n", count) } if count < 2 { log.Debugf("Processed row (%d):", count) for i, col := range cols { log.Debugf("%s: %v", col, values[i]) } } } log.Infof("Rows processed %d", count) } func buildExtractSqlSentence(schema, table string, colNames []string) string { var sbColumns strings.Builder if len(colNames) == 0 { sbColumns.WriteString("*") } else { for i, col := range colNames { sbColumns.WriteString(`[`) sbColumns.WriteString(col) sbColumns.WriteString(`]`) if i < len(colNames)-1 { sbColumns.WriteString(", ") } } } return fmt.Sprintf(`SELECT %s FROM [%s].[%s] WITH (NOLOCK)`, sbColumns.String(), schema, table) }