fix: make MySQL writer execute generated DDL
This commit is contained in:
@@ -9,6 +9,8 @@ import (
|
|||||||
"sort"
|
"sort"
|
||||||
"strings"
|
"strings"
|
||||||
|
|
||||||
|
_ "github.com/go-sql-driver/mysql"
|
||||||
|
|
||||||
"git.warky.dev/wdevs/relspecgo/pkg/mariadb"
|
"git.warky.dev/wdevs/relspecgo/pkg/mariadb"
|
||||||
"git.warky.dev/wdevs/relspecgo/pkg/models"
|
"git.warky.dev/wdevs/relspecgo/pkg/models"
|
||||||
"git.warky.dev/wdevs/relspecgo/pkg/writers"
|
"git.warky.dev/wdevs/relspecgo/pkg/writers"
|
||||||
@@ -39,7 +41,13 @@ func (w *Writer) WriteDatabase(db *models.Database) error {
|
|||||||
w.writer = os.Stdout
|
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 {
|
for _, s := range db.Schemas {
|
||||||
if err := w.WriteSchema(s); err != nil {
|
if err := w.WriteSchema(s); err != nil {
|
||||||
return err
|
return err
|
||||||
@@ -121,7 +129,7 @@ func (w *Writer) execute(dbm *models.Database, conn string) error {
|
|||||||
var b strings.Builder
|
var b strings.Builder
|
||||||
old := w.writer
|
old := w.writer
|
||||||
w.writer = &b
|
w.writer = &b
|
||||||
if err := w.WriteDatabase(dbm); err != nil {
|
if err := w.writeDatabaseDDL(dbm); err != nil {
|
||||||
w.writer = old
|
w.writer = old
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
@@ -132,8 +140,8 @@ func (w *Writer) execute(dbm *models.Database, conn string) error {
|
|||||||
}
|
}
|
||||||
defer db.Close()
|
defer db.Close()
|
||||||
for _, stmt := range strings.Split(b.String(), ";\n") {
|
for _, stmt := range strings.Split(b.String(), ";\n") {
|
||||||
stmt = strings.TrimSpace(stmt)
|
stmt = stripComments(strings.TrimSpace(stmt))
|
||||||
if stmt == "" || strings.HasPrefix(stmt, "--") {
|
if stmt == "" {
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
if _, err := db.ExecContext(context.Background(), stmt); err != nil {
|
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
|
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 quote(s string) string { return "`" + strings.ReplaceAll(s, "`", "``") + "`" }
|
||||||
func quoted(xs []string) string {
|
func quoted(xs []string) string {
|
||||||
out := make([]string, len(xs))
|
out := make([]string, len(xs))
|
||||||
|
|||||||
@@ -9,6 +9,13 @@ import (
|
|||||||
"git.warky.dev/wdevs/relspecgo/pkg/writers"
|
"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) {
|
func TestWriterGeneratesMySQLDDL(t *testing.T) {
|
||||||
db := models.InitDatabase("app")
|
db := models.InitDatabase("app")
|
||||||
s := models.InitSchema("app")
|
s := models.InitSchema("app")
|
||||||
|
|||||||
Reference in New Issue
Block a user