Fix Delete() to work with postgres

pull/2/head
Vinícius Garcia 2020-12-30 12:33:52 -03:00
parent ed8f0550aa
commit 995ccd680c
2 changed files with 156 additions and 146 deletions

View File

@ -348,7 +348,7 @@ func (c Client) Delete(
return nil
}
query := buildDeleteQuery(c.tableName, ids)
query := buildDeleteQuery(c.dialect, c.tableName, ids)
_, err := c.db.DB().ExecContext(ctx, query, ids...)
@ -737,15 +737,15 @@ func getCachedTagInfo(tagInfoCache map[reflect.Type]structInfo, key reflect.Type
return info
}
func buildDeleteQuery(table string, ids []interface{}) string {
func buildDeleteQuery(dialect dialect, table string, ids []interface{}) string {
values := []string{}
for range ids {
values = append(values, "?")
for i := range ids {
values = append(values, dialect.Placeholder(i))
}
return fmt.Sprintf(
"DELETE FROM `%s` WHERE id IN (%s)",
table,
"DELETE FROM %s WHERE id IN (%s)",
dialect.Escape(table),
strings.Join(values, ","),
)
}

View File

@ -228,17 +228,19 @@ func TestInsert(t *testing.T) {
}
func TestDelete(t *testing.T) {
err := createTable("sqlite3")
for _, driver := range []string{"sqlite3", "postgres"} {
t.Run(driver, func(t *testing.T) {
err := createTable(driver)
if err != nil {
t.Fatal("could not create test table!, reason:", err.Error())
}
t.Run("should ignore empty lists of ids", func(t *testing.T) {
db := connectDB(t, "sqlite3")
db := connectDB(t, driver)
defer db.Close()
ctx := context.Background()
c := newTestClient(db, "sqlite3", "users")
c := newTestClient(db, driver, "users")
u := User{
Name: "Won't be deleted",
@ -249,7 +251,7 @@ func TestDelete(t *testing.T) {
assert.NotEqual(t, uint(0), u.ID)
result := User{}
it := c.db.Raw("SELECT * FROM users WHERE id=?", u.ID)
it := c.db.Raw("SELECT * FROM users WHERE id="+c.dialect.Placeholder(0), u.ID)
it.Scan(&result)
assert.Equal(t, u.ID, result.ID)
@ -257,17 +259,17 @@ func TestDelete(t *testing.T) {
assert.Equal(t, nil, err)
result = User{}
it = c.db.Raw("SELECT * FROM users WHERE id=?", u.ID)
it = c.db.Raw("SELECT * FROM users WHERE id="+c.dialect.Placeholder(0), u.ID)
it.Scan(&result)
assert.Equal(t, u.ID, result.ID)
})
t.Run("should delete one id correctly", func(t *testing.T) {
db := connectDB(t, "sqlite3")
db := connectDB(t, driver)
defer db.Close()
ctx := context.Background()
c := newTestClient(db, "sqlite3", "users")
c := newTestClient(db, driver, "users")
u1 := User{
Name: "Fernanda",
@ -278,7 +280,7 @@ func TestDelete(t *testing.T) {
assert.NotEqual(t, uint(0), u1.ID)
result := User{}
it := c.db.Raw("SELECT * FROM users WHERE id=?", u1.ID)
it := c.db.Raw("SELECT * FROM users WHERE id="+c.dialect.Placeholder(0), u1.ID)
it.Scan(&result)
assert.Equal(t, u1.ID, result.ID)
@ -291,7 +293,7 @@ func TestDelete(t *testing.T) {
assert.NotEqual(t, uint(0), u2.ID)
result = User{}
it = c.db.Raw("SELECT * FROM users WHERE id=?", u2.ID)
it = c.db.Raw("SELECT * FROM users WHERE id="+c.dialect.Placeholder(0), u2.ID)
it.Scan(&result)
assert.Equal(t, u2.ID, result.ID)
@ -299,7 +301,7 @@ func TestDelete(t *testing.T) {
assert.Equal(t, nil, err)
result = User{}
it = c.db.Raw("SELECT * FROM users WHERE id=?", u1.ID)
it = c.db.Raw("SELECT * FROM users WHERE id="+c.dialect.Placeholder(0), u1.ID)
it.Scan(&result)
assert.Equal(t, nil, it.Error)
@ -307,7 +309,7 @@ func TestDelete(t *testing.T) {
assert.Equal(t, "", result.Name)
result = User{}
it = c.db.Raw("SELECT * FROM users WHERE id=?", u2.ID)
it = c.db.Raw("SELECT * FROM users WHERE id="+c.dialect.Placeholder(0), u2.ID)
it.Scan(&result)
assert.Equal(t, nil, it.Error)
@ -316,11 +318,11 @@ func TestDelete(t *testing.T) {
})
t.Run("should delete multiple ids correctly", func(t *testing.T) {
db := connectDB(t, "sqlite3")
db := connectDB(t, driver)
defer db.Close()
ctx := context.Background()
c := newTestClient(db, "sqlite3", "users")
c := newTestClient(db, driver, "users")
u1 := User{
Name: "Fernanda",
@ -344,17 +346,17 @@ func TestDelete(t *testing.T) {
assert.NotEqual(t, uint(0), u3.ID)
result := User{}
it := c.db.Raw("SELECT * FROM users WHERE id=?", u1.ID)
it := c.db.Raw("SELECT * FROM users WHERE id="+c.dialect.Placeholder(0), u1.ID)
it.Scan(&result)
assert.Equal(t, u1.ID, result.ID)
result = User{}
it = c.db.Raw("SELECT * FROM users WHERE id=?", u2.ID)
it = c.db.Raw("SELECT * FROM users WHERE id="+c.dialect.Placeholder(0), u2.ID)
it.Scan(&result)
assert.Equal(t, u2.ID, result.ID)
result = User{}
it = c.db.Raw("SELECT * FROM users WHERE id=?", u3.ID)
it = c.db.Raw("SELECT * FROM users WHERE id="+c.dialect.Placeholder(0), u3.ID)
it.Scan(&result)
assert.Equal(t, u3.ID, result.ID)
@ -362,13 +364,21 @@ func TestDelete(t *testing.T) {
assert.Equal(t, nil, err)
results := []User{}
it = c.db.Raw("SELECT * FROM users WHERE id IN (?, ?, ?)", u1.ID, u2.ID, u3.ID)
it = c.db.Raw(
fmt.Sprintf(
"SELECT * FROM users WHERE id IN (%s, %s, %s)",
c.dialect.Placeholder(0), c.dialect.Placeholder(1), c.dialect.Placeholder(2),
),
u1.ID, u2.ID, u3.ID,
)
it.Scan(&results)
assert.Equal(t, nil, it.Error)
assert.Equal(t, 1, len(results))
assert.Equal(t, "This won't be deleted", results[0].Name)
})
})
}
}
func TestUpdate(t *testing.T) {