Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sqlite/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
将结构接口传递给sqlite exec_Sqlite_Go_Struct_Go Sqlite3 - Fatal编程技术网

将结构接口传递给sqlite exec

将结构接口传递给sqlite exec,sqlite,go,struct,go-sqlite3,Sqlite,Go,Struct,Go Sqlite3,在Go中,我试图从Go-sqlite3向语句.Exec()传递一个接口{}。我确信这是一个已解决的问题,但我无法解决 基本上,我有一个struct,其中包含我想要传递给函数的行数据,该函数将插入sqlite数据库。问题是我希望能够以编程方式控制进入语句.Exec()函数的内容 以下是摘录: 类型hostRows结构{ 域字符串 } 类型clientRows结构{ 名称字符串 } func main(){ ... 数据:=主机行{域:“dom.com”} insertRow(sqliteData

在Go中,我试图从
Go-sqlite3
语句.Exec()传递一个
接口{}
。我确信这是一个已解决的问题,但我无法解决

基本上,我有一个
struct
,其中包含我想要传递给函数的行数据,该函数将插入sqlite数据库。问题是我希望能够以编程方式控制进入
语句.Exec()函数的内容

以下是摘录:


类型hostRows结构{
域字符串
}
类型clientRows结构{
名称字符串
}
func main(){
...
数据:=主机行{域:“dom.com”}
insertRow(sqliteDatabase,data)
数据2:=clientRows{name:“bob”}
insertRow(sqliteDatabase,data2)
...
}
func insertRow(db*sql.db,行接口{}){
insertSQL:=“插入表(列)值(?)
语句:=db.Prepare(insertSQL)
statement.Exec(row)//问题是,如何提取接口中的元素以将其传递给函数,以便Exec理解
}
我知道在这个示例中,我可以将行类型硬编码到struct,并键入
statement.Exec(row.(hostRows.domain)
,但现在当传递客户机结构时,代码将中断到

以下是
Exec
功能的减速

func(s*Stmt)Exec(args…接口{})(结果,错误)
我试过玩
reflect
,但到目前为止还不起作用。 目前我唯一的解决方案是使用一个
开关
条件,它可以检查并为
Exec
准备正确的命令,但这还不够可靠

键入hostRows结构{
域字符串
}
类型clientRows结构{
名称字符串
}
func main(){
...
数据:=主机行{域:“dom.com”}
insertRow(sqliteDatabase,1,数据)
数据2:=clientRows{name:“bob”}
insertRow(sqliteDatabase,2,data2)
...
}
func insertRow(db*sql.db,i int,行接口{}){
insertSQL:=“插入表(列)值(?)
语句:=db.Prepare(insertSQL)
//这基本上是一个可行的解决方案,但我相信有一个更好的解决方案
开关i{
案例1:
数据:=行。(主机行)
statement.Exec(data.domain)
案例2:
数据:=行。(clientRows)
statement.Exec(data.name)
}
}
编辑:更正INSERT语句;忘了列吧。将
statement.Exec(row.domain)
更正为
statement.Exec(row.hostRows.domain)

edit2:添加了第二个示例

请记住,要使
reflect.Interface()
正常工作,必须导出字段。要使用反射实现您想要的效果,您可以尝试以下方法:

type hostRows struct {
    //Should export field to read it using reflect.Value.Interface()
    Domain string
}

type clientRows struct {
    //Should export field to read it using reflect.Value.Interface()
    Name string
}

func insertRow(db *sql.DB, i int, row interface{}) {
    rv := reflect.ValueOf(row)
    var args []interface{}
    for i := 0; i < rv.NumField(); i++ {
        args = append(args, rv.Field(i).Interface())
    }
    db.Exec("Insert Satement...", args...)
}
键入hostRows结构{
//应该导出字段以使用reflect.Value.Interface()读取它
域字符串
}
类型clientRows结构{
//应该导出字段以使用reflect.Value.Interface()读取它
名称字符串
}
func insertRow(db*sql.db,i int,行接口{}){
rv:=反射值(行)
var args[]接口{}
对于i:=0;i
应该为带有hostRows的insertRow生成什么样的SQL语句?clientRow怎么了?请给出一个例子,因为struct不能用作Exec的参数。这基本上是我的问题。当结构中变量的名称可能根据我发送给
insertRow
的变量的不同而变化时,我如何传递结构的元素?@Volker我添加了第二个我正在寻找的行为类型示例,尽管解决方案是不好的样板…天才,谢谢,我想我的思路是对的,但是我忘记了从结构导出字段。这仍然是一个我很难理解的概念。谢谢@Pablo