MySQL5.7下Knex中GROUP_CONCAT重复列名而非列值的问题求助
解决Knex迁移中GROUP_CONCAT拼接字符串而非列值的问题
问题根源在于你用了?占位符传递列名pf.family——Knex的?是值占位符,会把传入的字符串当作SQL中的字符串常量处理,最终GROUP_CONCAT操作的是字符串'pf.family',而非对应列的实际值。
要修复这个问题,需要使用Knex的标识符占位符??,它专门用于处理表名、列名这类SQL标识符,会自动按数据库规则转义(MySQL中用反引号包裹)。
修正后的完整代码
/** * @param { import("knex").Knex } knex * @returns { Promise<void> } */ exports.up = function (knex) { return knex.schema.createViewOrReplace( "product_families_view", function (view) { view.columns(["product_id", "part_number", "families"]); view.as( knex("product_families AS pf") .select([ "pfp.product_id", "pfp.part_number", // 用??替代?处理列名标识符 knex.raw("GROUP_CONCAT(?? ORDER BY ?? SEPARATOR ?) as ??", [ "pf.family", "pf.family", " ", "families", ]), ]) .innerJoin( "product_families_products AS pfp", "pfp.family_id", "pf.id" ) .groupBy("pfp.product_id") ); } ); };
替代方案:直接写明确列名
如果不想用占位符,也可以手动转义列名后直接写入raw字符串:
knex.raw("GROUP_CONCAT(`pf`.`family` ORDER BY `pf`.`family` SEPARATOR ' ') as `families`")
核心规则
?用于绑定数据值(如字符串、数字),会自动添加引号??用于绑定SQL标识符(列名、表名、别名),会自动用数据库对应符号包裹(MySQL为反引号)
内容的提问来源于stack exchange,提问作者kliuyyyy
相关产品推荐
相关产品推荐

