我的金刚sqlite插入功能。我用的是这个包"github.com/mattn/go-sqlite3"
func Insert(args ...string)(err error){
db, err:=sql.Open("sqlite3","sqlite.db")
if err !=nil {
return
}
q, err := db.Prepare(args[0])
if err !=nil{
return
}
_,err = q.Exec(args[1:]...)
return
}
main (){
err := Insert("INSERT INTO table(first,last) VALUES(?,?)","Nantha","nk")
if err !=nil{
fmt.Println(err.Error())
return
}
}我得到了这个错误
不能在q.Exec参数中使用args (类型[]字符串)作为类型[]接口{}
发布于 2019-09-10 10:16:03
错误非常明显,函数期望类型为[]interface{},但传递的值为[]string类型。您必须先将[]string转换为[]interface{},然后再将其传递给Exec。这样做的方法是遍历字符串并将每个字符串添加到interface{}的一个新片段中。
作为另一种方法,您可以更改Insert参数类型。
func Insert(query string, args ...interface{}) (err error) {
db, err := sql.Open("sqlite3", "sqlite.db")
if err != nil {
return err
}
q, err := db.Prepare(query)
if err != nil {
return err
}
_, err = q.Exec(args...)
return err
}
func main() {
err := Insert("INSERT INTO table(first,last) VALUES(?,?)", "Nantha", "nk")
if err !=nil{
fmt.Println(err.Error())
return
}
}请注意,您使用的database/sql包不正确。从该包的函数/方法返回的许多对象需要关闭才能释放底层资源。
这对于Open返回的Open、Prepare返回的*sql.Stmt、Query返回的*sql.Rows等都是正确的。
因此,您的函数应该更接近于这样的内容:
func Insert(query string, args ...interface{}) (err error) {
db, err := sql.Open("sqlite3", "sqlite.db")
if err != nil {
return err
}
defer db.Close()
q, err := db.Prepare(query)
if err != nil {
return err
}
defer q.Close()
_, err = q.Exec(args...)
return err
}还请注意,sql.DB是可重用的,这意味着您不必每次需要与数据库交谈时都需要sql.Open一个新实例。
公开会议上的文档:
返回的DB对于多个goroutines并发使用是安全的,并且维护它自己的空闲连接池。因此,应该只调用一次Open函数。很少有必要关闭DB。
如果您继续这样做,每次调用DB或任何其他需要与DB对话的函数时都会打开一个新的DB,那么您的程序的性能将比只有一个DB并让函数重用时更糟。
https://stackoverflow.com/questions/57868506
复制相似问题