插入clickhouse数据库时, 使用map插入IntMap,StrMap中,报错:Syntax error: failed at position 66 (‘[‘)
·
1.插入的insert语句
INSERT INTO user_order ( Id, UserId, BiTime, ServiceName, IntMap['channel_id'],IntMap['prices'],IntMap['goods_id'], StrMap) VALUES ( ?, ?, ?, ?, ?, ?, map('action', ?, 'order_id', ?, 'order_status', ?, 'third_sn', ?, 'reason', ?, 'ip', ?, 'items', ?))" 报错:message: Syntax error: failed at position 66 ('['): ['channel_id'],IntMap['prices'],IntMap['goods_id'], StrMap) VALUES (1799397891626827683, 415432, 1752735936, 'backstage', 1, 5000, 1101, map('action', 'suppleme. Expected one of: token sequence, Dot, token, Comma, ClosingRoundBracket
对上面sql分析错误原因:
上面是一个语法错误,因为在INSERT语句中错误地引用了Map字段的特定键,在ClickHouse中,不能直接在INSERT语句中指定Map列的个别键,必须使用map()函数构造整个Map对象
2.正确语法解决方案
正确的sql如下:
INSERT INTO user_order (Id, UserId, BiTime, ServiceName, IntMap, StrMap)
VALUES (?, ?, ?, ?,
map('channel_id', ?, 'prices', ?, 'goods_id', ?, 'purchase_type', ?),
map('action', ?, 'items', ?, 'order_id', ?, 'bank_code', ?, 'order_status', ?, 'reason', ?, 'third_sn', ?, 'ip', ?)
)
3.修复后的代码
sql := `
INSERT INTO user_order (Id, UserId, BiTime, ServiceName, IntMap, StrMap)
VALUES (?, ?, ?, ?,
map('channel_id', ?, 'prices', ?, 'goods_id', ?, 'purchase_type', ?),
map('action', ?, 'items', ?, 'order_id', ?, 'bank_code', ?, 'order_status', ?, 'reason', ?, 'third_sn', ?, 'ip', ?)
)`
queryUp, err := ClickHouse.ExecContext(ctx, sql,
fastid.CommonConfig.GenInt64ID(), // Id
userId, // UserId
time.Now().Unix(), // BiTime
ServiceName, // ServiceName
// IntMap参数 (4个)
channelId, // channel_id
prices, // prices
int64(goodsId), // goods_id
0, // purchase_type (默认值)
// StrMap参数 (10个)
"supplement_order", // action
items, // items
req.Or.OrderId, // order_id
"", // bank_code (空字符串)
"success", // order_status
req.Or.Reason, // reason
req.Or.ThirdSn, // third_sn
ctx.ClientIP(), // ip
"", // 实际没有额外参数,删除此行
)
4.关键修复说明:
4.1 移除无效语法
- (Id, UserId, BiTime, ServiceName, IntMap['channel_id'],IntMap['prices'],IntMap['goods_id'], StrMap)
+ (Id, UserId, BiTime, ServiceName, IntMap, StrMap)
4.2 正确构造Map对象
map('channel_id', ?, 'prices', ?, 'goods_id', ?, 'purchase_type', ?)
4.3 完整包含所有键
map('action', ?, 'items', ?, 'order_id', ?, 'bank_code', ?,
'order_status', ?, 'reason', ?, 'third_sn', ?, 'ip', ?)
4.4 调整参数数量:
-
增加了缺失的
purchase_type和bank_code默认值 -
修正后的VALUES子句对应16个参数(4列 + 4个IntMap + 8个StrMap = 16)
5. 为什么之前语法错误?
ClickHouse的INSERT语句不允许:
INSERT INTO table (MapColumn['key']) VALUES (...) // ❌ 错误语法
只允许:
INSERT INTO table (MapColumn) VALUES (map('key', value)) // ✅ 正确语法
5.验证方法
执行后查询最新数据:
SELECT
IntMap,
StrMap
FROM bi_user_mall
ORDER BY BiTime DESC
LIMIT 1
预期结果应包含完整键值对:
IntMap: {'channel_id':值, 'prices':值, 'goods_id':值, 'purchase_type':0}
StrMap: {'action':'supplement_order', 'items':值, ... 'ip':值}
更多推荐


所有评论(0)