作为查询的一部分的Golang查询字符串

作为查询的一部分的Golang查询字符串,go,Go,我想使用字符串作为查询的一部分 func GetAll(id int) { var queryPart string if id != 0 { queryPart = fmt.Sprintf("WHERE id = %d", id) } else { queryPart = "" } database.DB.Query("SELECT name FROM table ?, queryPart) } 在database.DB中,我有*DB.Sql实例 如何

我想使用字符串作为查询的一部分

func GetAll(id int) {
  var queryPart string
  if id != 0 {
    queryPart = fmt.Sprintf("WHERE id = %d", id)
  } else {
    queryPart = ""
  }


  database.DB.Query("SELECT name FROM table ?, queryPart)
}
在database.DB中,我有*DB.Sql实例

如何让它工作?有了这些代码,我仍然会得到“您的SQL语法有错误”。

占位符(
)仅用于变量,而不是语句

您应该有两个单独的查询:

  if id != 0 {
    database.DB.Query("SELECT name FROM table WHERE id = ?", id)
  } else {
    database.DB.Query("SELECT name FROM table")
  }
另外:使用
Sprintf(“其中id=%d”,id)
会破坏占位符的用途。

占位符(
)仅用于变量,而不是语句

您应该有两个单独的查询:

  if id != 0 {
    database.DB.Query("SELECT name FROM table WHERE id = ?", id)
  } else {
    database.DB.Query("SELECT name FROM table")
  }

另外:使用
Sprintf(“其中id=%d”,id)
会破坏占位符的作用。

您可以逐步构建查询,仅在需要时添加参数

// Build a query (columns and table being strings)
q := fmt.Sprintf("SELECT %s FROM %s", columns, table)
args := []interface{}{}

// Add conditional query/args
if id != 0 {
 q = fmt.Sprintf("%s WHERE id=?",q)
 args = append(args,id)    
}

// Perform the query
database.DB.Query(q,args...)

如果你发现自己做了很多事情,考虑编写一个小的查询生成器,它可以让你轻松地构建SQL查询而不必太大惊小怪。它可以相对简单,有用于选择、连接等的插槽和用于参数的数组。

您可以逐步构建查询,只在需要时添加参数

// Build a query (columns and table being strings)
q := fmt.Sprintf("SELECT %s FROM %s", columns, table)
args := []interface{}{}

// Add conditional query/args
if id != 0 {
 q = fmt.Sprintf("%s WHERE id=?",q)
 args = append(args,id)    
}

// Perform the query
database.DB.Query(q,args...)

如果你发现自己做了很多事情,考虑编写一个小的查询生成器,它可以让你轻松地构建SQL查询而不必太大惊小怪。它可以相对简单,有用于选择、连接等的插槽和用于args的数组。

这是唯一的方法吗?我有一个非常复杂的查询,我不想重复代码。@nexeq您可以将查询字符串与
+
连接起来,并使用
append
将参数收集到一个片段中,然后,在结束时,像这样执行查询:
查询(queryString,args…
。这是唯一的方法吗?我有一个非常复杂的查询,我不想重复代码。@nexeq您可以将查询字符串与
+
连接起来,并使用
append
将参数收集到一个片段中,然后,在结束时,像这样执行查询:
查询(queryString,args…
@mkopriva感谢您的编辑,我在同一时间编辑,我想它发生了冲突。我看到了,不用担心;)很好,如果你有一些简单查询生成器的例子,我真的很想看看:)我写的/使用的在这里,它可能适合你,也可能不适合你,或者提供一个有用的ref@mkopriva谢谢你的编辑,我在同一时间编辑,我想它发生了冲突。我看到了,不用担心;)很好,如果您有一些简单查询生成器的示例,我真的很想看看:)我编写/使用的示例就在这里,它可能适合您,也可能不适合您,或者提供了有用的参考