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_typebank_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':值}

更多推荐