Knex的returning方法能否返回PostgreSQL的pg_column_size计算结果?
你遇到的报错原因确实是Knex默认会将returning方法的字符串参数识别为表列名,自动添加引号转义,导致整个函数表达式被误识别为不存在的列名。要实现你的需求,直接用knex.raw包裹原生SQL片段即可,这部分内容Knex不会做额外转义,会原样拼接进RETURNING子句:
示例代码
const result = await knex('MyTable') .insert({ MyColumn: 'Whatever' }) .returning([ 'ID', // 用raw包裹函数表达式,as指定返回字段别名 knex.raw('pg_column_size("MyColumn") as pg_column_size') ]) // 返回结果格式示例:[{ ID: 4, pg_column_size: 9 }] console.log(result)
如果需要验证最终生成的SQL是否符合预期,可以调用toSQL()方法打印:
const generateSql = knex('MyTable') .insert({ MyColumn: 'Whatever' }) .returning([ 'ID', knex.raw('pg_column_size("MyColumn") as pg_column_size') ]) .toSQL() console.log(generateSql.sql) // 输出:insert into "MyTable" ("MyColumn") values ($1) returning "ID", pg_column_size("MyColumn") as pg_column_size
该方案无需额外执行SELECT查询,完全和原生SQL的执行逻辑一致。
内容的提问来源于stack exchange,提问作者James Mayes
相关产品推荐
相关产品推荐

