我的golang 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(类型[] string)作为类型[] interface {}
错误非常明显,该函数需要type,[]interface{}
但是您要传递type的值[]string
。您必须先将转换[]string
为,[]interface{}
然后再传递给Exec
。这样做的方法是遍历字符串,并将每个字符串添加到的新切片中interface{}
。
https://golang.org/doc/faq#convert_slice_of_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
包装不正确。从该包的函数/方法返回的许多对象都需要关闭以释放基础资源。
因为这是真正的*sql.DB
由归国Open
,*sql.Stmt
由归国Prepare
,*sql.Rows
由返回Query
等
因此,您的函数应该看起来更像这样:
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
每次需要与数据库对话时都使用新实例。
从Open的文档中:
返回的数据库可安全地供多个goroutine并发使用,并维护其自己的空闲连接池。因此,Open函数应仅被调用一次。几乎不需要关闭数据库。
如果您继续按照自己的方式进行操作,则DB
每次调用Insert
或需要与之通信的任何其他函数时都打开一个新文件,则该DB
程序的性能将比仅使用一个DB
函数并重用该函数的情况差。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句