From 778379538b2f46052eb7c0d02573b89a0fea0f83 Mon Sep 17 00:00:00 2001 From: SG Command Date: Sat, 3 Oct 2026 12:42:07 +0200 Subject: [PATCH] fix: make MySQL writer execute generated DDL --- pkg/writers/mysql/writer.go | 27 +++++++++++++++++++++++---- pkg/writers/mysql/writer_test.go | 7 +++++++ 2 files changed, 30 insertions(+), 4 deletions(-) diff --git a/pkg/writers/mysql/writer.go b/pkg/writers/mysql/writer.go index 131a464..dd8707b 100644 --- a/pkg/writers/mysql/writer.go +++ b/pkg/writers/mysql/writer.go @@ -9,6 +9,8 @@ import ( "sort" "strings" + _ "github.com/go-sql-driver/mysql" + "git.warky.dev/wdevs/relspecgo/pkg/mariadb" "git.warky.dev/wdevs/relspecgo/pkg/models" "git.warky.dev/wdevs/relspecgo/pkg/writers" @@ -39,7 +41,13 @@ func (w *Writer) WriteDatabase(db *models.Database) error { w.writer = os.Stdout } } - fmt.Fprintf(w.writer, "-- MySQL Database Schema\n-- Database: %s\n-- Generated by RelSpec\n\n", db.Name) + return w.writeDatabaseDDL(db) +} + +func (w *Writer) writeDatabaseDDL(db *models.Database) error { + if _, err := fmt.Fprintf(w.writer, "-- MySQL Database Schema\n-- Database: %s\n-- Generated by RelSpec\n\n", db.Name); err != nil { + return err + } for _, s := range db.Schemas { if err := w.WriteSchema(s); err != nil { return err @@ -121,7 +129,7 @@ func (w *Writer) execute(dbm *models.Database, conn string) error { var b strings.Builder old := w.writer w.writer = &b - if err := w.WriteDatabase(dbm); err != nil { + if err := w.writeDatabaseDDL(dbm); err != nil { w.writer = old return err } @@ -132,8 +140,8 @@ func (w *Writer) execute(dbm *models.Database, conn string) error { } defer db.Close() for _, stmt := range strings.Split(b.String(), ";\n") { - stmt = strings.TrimSpace(stmt) - if stmt == "" || strings.HasPrefix(stmt, "--") { + stmt = stripComments(strings.TrimSpace(stmt)) + if stmt == "" { continue } if _, err := db.ExecContext(context.Background(), stmt); err != nil { @@ -142,6 +150,17 @@ func (w *Writer) execute(dbm *models.Database, conn string) error { } return nil } +func stripComments(sqlText string) string { + lines := strings.Split(sqlText, "\n") + kept := lines[:0] + for _, line := range lines { + if !strings.HasPrefix(strings.TrimSpace(line), "--") { + kept = append(kept, line) + } + } + return strings.TrimSpace(strings.Join(kept, "\n")) +} + func quote(s string) string { return "`" + strings.ReplaceAll(s, "`", "``") + "`" } func quoted(xs []string) string { out := make([]string, len(xs)) diff --git a/pkg/writers/mysql/writer_test.go b/pkg/writers/mysql/writer_test.go index 48923fb..1a53fad 100644 --- a/pkg/writers/mysql/writer_test.go +++ b/pkg/writers/mysql/writer_test.go @@ -9,6 +9,13 @@ import ( "git.warky.dev/wdevs/relspecgo/pkg/writers" ) +func TestStripComments(t *testing.T) { + got := stripComments("-- header\nCREATE TABLE `users` (\n `id` INT\n);") + if strings.HasPrefix(got, "--") || !strings.HasPrefix(got, "CREATE TABLE") { + t.Fatalf("stripComments() = %q", got) + } +} + func TestWriterGeneratesMySQLDDL(t *testing.T) { db := models.InitDatabase("app") s := models.InitSchema("app")