fix: make MySQL writer execute generated DDL
This commit is contained in:
@@ -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))
|
||||
|
||||
@@ -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")
|
||||
|
||||
Reference in New Issue
Block a user