我使用golang mysql来执行delete语句
删除的目标是使用IN条件,但只删除一条记录。是什么造成的?
go 1.16
import (
"database/sql"
"errors"
"fmt"
"io"
"log"
"net/http"
"strconv"
"strings"
"time"
"github.com/aws/aws-lambda-go/events"
"github.com/aws/aws-lambda-go/lambda"
// "github.com/leekchan/timeutil"
_ "github.com/go-sql-driver/mysql" //v1.7.1
)
func SelectQuery(action string, schema string) string {
if action == "del" {
switch schema {
case "schema1":
return "DELETE FROM `schema1` WHERE `id` IN (?)"
default:
panic("bad request")
}
}
}
func DelAction(db *sql.DB, schema string, list []int) int64 {
strList := []string{}
for _, v := range list { // this is id list ex.[1, 2, 3]
strList = append(strList, strconv.Itoa(v))
}
delQeury := SelectQuery("del", schema) // "DELETE FROM `schema1` WHERE `id` IN (?)"
param := strings.Join(strList, ",") // param: 1,2,3
delRes, err := db.Exec(delQeury, param)
delCnt, err := delRes.RowsAffected()
return delCnt // delete only 1 records. even if param have 3 values
}
我想删除所有3条记录,但只删除了1条记录
add info创建一个ID int slices的数组,并删除。例如[1、2、3]
res, err := db.Query(query) // select query
list := []int{}
for res.Next() {
u := &Logs{} // type logs is id int
if err := res.Scan(&u.id); err != nil {
fmt.Println("scan error")
panic(err.Error())
} else {
list = append(list, u.id)
}
}
2条答案
按热度按时间kmb7vmvb1#
这解决了它。我不知道这是不是最好的方法,但它是这样工作的。
a2mppw5e2#
问号仅表示一个参数,而不是参数列表。传递的参数列表将被转换为它的字符串表示形式,然后被截断。
下面是纯SQL中的等价物:
我建议在go中构建整个SQL语句而不带参数。在Python中,你会使用execute_many方法(),我不知道go是否提供类似的东西。