在mysql查询中使用where子句的golang切片

时间:2017-07-27 13:03:21

标签: go

我正在尝试运行如下所示的查询,但只返回第一个id值: -

select * from `table` where table`.`id` in ('1', '2', '3', '4', '5', '6', '7', '9', '11', '13', '14', '15', '17') and `table`.`deleted_at` is null

我做了以下事情: -

var aID = make([]string, 0)
var in india // india is struct

for rows.Next() {
    cook := rows.Scan(&in.ID)

    aID = append(aID, strconv.Itoa(in.ID))
}

asID = strings.Join(aID, ",")

anotherRow,err := db.Query("SELECT * from table2 where id in (?)", asID)
if err != nil { fmt.Printf("Error: ", err) }
// ... Other line follows up with "for anotherRow.Next() and fetching"

在获取数据时,它只返回" 1"的值。并忽略与他一起传递的所有其他ID,'2', '3', '4', '5', '6', '7', '9', '11', '13', '14', '15', '17'

我怎样才能正确传递?

我正在使用go-sql-driver/mysql

常见问题:

  1. aID确实包含所有这些数字为字符串和

  2. 表格包含id上面提供的所有可用行。

  3. table来自获取id并附加到aID的位置,id中存储aID的其他记录将以{in获取1}}来自table2的陈述。

  4. 由于

6 个答案:

答案 0 :(得分:5)

您可以这样做:

args := make([]interface{}, len(asID))
for i, id := range asID {
    args[i] = id
}
stmt := `SELECT * from table2 where id in (?` + strings.Repeat(",?", len(args)-1) + `)`
anotherRow, err := db.Query(stmt, args...)

请注意,如果asID可以使len == 0,你会想要一个警卫。

如果您要传递任何其他参数,则必须将它们添加到args切片。

另外需要注意的是,您应该明确命名所需的列,这样可以保证您在正确的列中扫描到正确的字段。

答案 1 :(得分:2)

尝试

q,args,err := sqlx.In("SELECT * FROM table2 WHERE id IN(?);", asID) //creates the query string and arguments
rows, err := db.Query(q,args...)

答案 2 :(得分:0)

由于您正在处理来自您自己的数据库的ID,并且如果您确定某人无法将恶意“ID”注入该代码,请不要使用占位符?并仅使用{ {1}}包。

fmt

这将导致fmt.Sprintf("SELECT * from table2 where id in (%s)", asID) 而不是SELECT * from table2 where id in (1,2,3,4...)

答案 3 :(得分:0)

示例:

class FeedbacksView(private val feedbackService: FeedbackService) : HorizontalLayout() {
    private val grid;
    private val sidebar;

    init {
       width = "100%"; height = "100%"
       grid = grid<FeedbackListModel> {
           flexGrow = 3.0
           setItems(feedbackService.fetchFeedbacks())
           // add columns ...
       }
       sidebar = verticalLayout {
           flexGrow = 1.0
           text("foo")
       }
    }
}

效果很好

答案 4 :(得分:0)

最巧妙的查询解决方案,使数组/切片直接与sql查询一起使用。这也是sql注入证明,因为您没有使用字符串连接,而是使用sql prepare语句

update

答案 5 :(得分:0)

也许是这样的。

func GetPlaceholders(values ...string) (placeholders string, parameters []interface{}) {
    n := len(values)
    p := make([]string, n)
    parameters = make([]interface{}, n)
    for i := 0; i < n; i++ {
        p[i] = "?"
        parameters[i] = values[i]
    }
    placeholders = strings.Join(p, ",")
    return placeholders, parameters
}

并像这样调用函数

placeholders, params := GetPlaceholders("1", "2", "3")

rows, err := db.Query(`select language, textkey, text 
        from language where textkey in (`+placeholders+`)
        order by language, textkey`, params...)