sql - SQL插入接口切片
问题描述
我正在编写一个向 SQLite 数据库添加一行的函数。
func ManageDB(db *sqlx.DB, query string, args ...interface{}) (int64, error) {
stmt, err := db.Prepare(query)
if err != nil {
return -1, err
}
defer stmt.Close()
tx, err := db.Begin()
if err != nil {
return -1, err
}
_, err = tx.Stmt(stmt).Exec(args...)
if err != nil {
log.Errorf("error inserting row '%s' %v", query, err)
log.Debugln("Doing rollback on Insert")
tx.Rollback()
} else {
tx.Commit()
}
return res.LastInsertId()
}
我用那个来称呼它
b := "INSERT INTO MYTABLE (name1, name2, name3, name4) VALUES($1, $2, $3, $4)"
c := []interface{}{
"string1",
"string2",
0, // int64
"string4", //string4
}
idt, err := models.ManageDB(
db, //db initialized
b,
c,
)
.......
当我测试该功能时,它可以正常工作,并且可以毫无问题地添加项目。
当我在主代码上运行它时,它会报告此错误:
sql: 转换参数 $1 类型: 不支持的类型 []interface {}, 接口切片
我不明白出了什么问题。
解决方案
在第二个片段中,您没有散布c
参数,您只是在传递c
. 因此,在 中ManageDB
,args
等于:
[]interface{}{
[]interface{}{
"string1",
"string2",
0,
"string4",
}
}
所以sqlx
认为你想$1
成为整个阵列。
修复将是这样调用ManageDB
:
models.ManageDB(db, b, c...)
推荐阅读
- c++ - 使用`std::unique_ptr`时`std::vector`中的数据不同
- python - 如何使具有 MultiIndex 轴值的 Pandas 系列采用 DatetimeIndex 进行重新索引?
- r - 我在拆分时间序列时哪里出错了?
- typescript - tsc 严格模式 - 如何使用提前返回来避免“对象可能是‘未定义’”
- haskell - 如何通过 Control.Arrow.loop 实现阶乘?
- azure-devops - 在 Azure DevOps 中,如何防止失败的单元测试导致构建失败?
- bash - #( 在 shell case 语句中
- c# - EF Core:获取实体及其子项的列表
- git - 如何使用 GitHub Actions 拒绝来自存储库成员的推送?
- python - 如何在 Python 中使用 JDBC 驱动程序和 Boto3 API 连接到现有的 Redshift 数据库