diff --git a/dialect_mysql.go b/dialect_mysql.go index f4f2b712..e68dc5e6 100644 --- a/dialect_mysql.go +++ b/dialect_mysql.go @@ -5,6 +5,7 @@ import ( "fmt" "io" "os/exec" + "regexp" "strings" _mysql "github.com/go-sql-driver/mysql" // Load MySQL Go driver @@ -112,17 +113,17 @@ func (m *mysql) Destroy(s store, model *Model) error { return nil } -func (m *mysql) Delete(s store, model *Model, query Query) error { - sb := query.toSQLBuilder(model) - - sql := fmt.Sprintf("DELETE FROM %s", m.Quote(model.TableName())) - sql = sb.buildWhereClauses(sql) +var asRegex = regexp.MustCompile(`\sAS\s\S+`) // exactly " AS non-spaces" - _, err := genericExec(s, sql, sb.Args()...) - if err != nil { - return fmt.Errorf("mysql delete: %w", err) - } - return nil +func (m *mysql) Delete(s store, model *Model, query Query) error { + sqlQuery, args := query.ToSQL(model) + // * MySQL does not support table alias for DELETE syntax until 8.0. + // * Do not generate SQL manually if they may have `WHERE IN`. + // * Spaces are intentionally added to make it easy to see on the log. + sqlQuery = asRegex.ReplaceAllString(sqlQuery, " ") + + _, err := genericExec(s, sqlQuery, args...) + return err } func (m *mysql) SelectOne(s store, model *Model, query Query) error { diff --git a/query_test.go b/query_test.go index 0aa346fd..9adf2723 100644 --- a/query_test.go +++ b/query_test.go @@ -74,10 +74,21 @@ func Test_Where_In_Slice(t *testing.T) { r.NoError(tx.Create(u2)) r.NoError(tx.Create(u3)) + Debug = true + defer func() { Debug = false }() + var songs []Song err := tx.Where("id in (?)", []uuid.UUID{u1.ID, u3.ID}).Where("title = ?", "A").All(&songs) r.NoError(err) r.Len(songs, 2) + + // especially https://github.com/gobuffalo/pop/issues/699 + err = tx.Where("id in (?)", []uuid.UUID{u1.ID, u3.ID}).Delete(&Song{}) + r.NoError(err) + + var remainingSongs []Song + r.NoError(tx.All(&remainingSongs)) + r.Len(remainingSongs, 1) }) }