Golang中如何使用int64数组作为数据库查询条件过滤记录
方案1:使用参数化查询(最推荐,避免SQL注入)
不同语言/ORM的写法略有不同,核心思路是把数组元素展开为多个查询参数,以下是几个常用场景的示例:
- Go 语言(标准库
database/sql)
import "strings" // 第一步:生成对应数量的占位符 placeholders := strings.Repeat("?,", len(ids)) placeholders = strings.TrimSuffix(placeholders, ",") // 拼接SQL模板 sqlStr := fmt.Sprintf("SELECT * FROM `table` WHERE id NOT IN (%s)", placeholders) // 第二步:把数组元素转为interface切片传参 args := make([]interface{}, len(ids)) for i, v := range ids { args[i] = v } // 执行查询 rows, err := db.Query(sqlStr, args...)
- Python(pymysql/psycopg2)
# 生成占位符,不同数据库占位符可能是%s或? placeholders = ', '.join(['%s'] * len(ids)) sql = f"SELECT * FROM `table` WHERE id NOT IN ({placeholders})" # 执行时传入ids数组作为参数 cursor.execute(sql, ids)
- Java(JDBC)
StringBuilder placeholders = new StringBuilder(); for (int i = 0; i < ids.size(); i++) { placeholders.append("?"); if (i != ids.size() -1) { placeholders.append(","); } } String sql = "SELECT * FROM `table` WHERE id NOT IN (" + placeholders + ")"; PreparedStatement ps = connection.prepareStatement(sql); for (int i = 0; i < ids.size(); i++) { ps.setLong(i+1, ids.get(i)); } ResultSet rs = ps.executeQuery();
方案2:可控场景下的字符串拼接(仅做参考)
如果确定ids数组的内容完全可控(比如是系统内部生成的固定值,没有任何用户输入参与),可以直接把数组转成逗号分隔的字符串拼接:
// 示例仅适用于完全可控的输入,否则会有SQL注入风险 var idStrs []string for _, v := range ids { idStrs = append(idStrs, strconv.FormatInt(v, 10)) } inStr := strings.Join(idStrs, ",") sqlStr := fmt.Sprintf("SELECT * FROM `table` WHERE id NOT IN (%s)", inStr)
额外说明
- 支持数组类型参数的数据库(比如PostgreSQL)可以用更简单的语法,不需要展开参数:
SELECT * FROM table WHERE id != ALL($1),直接传入int64数组作为$1的参数即可 - 不要手动给int类型的查询值加引号,会导致索引失效甚至查询逻辑错误
内容的提问来源于stack exchange,提问作者aakash singh
相关产品推荐
相关产品推荐

