ObjectionJS更新JSON字段时出现未知列'lng'错误求助
问题根源与解决方案
问题原因
你的代码报错是因为ObjectionJS/Knex没有正确识别address是JSON类型字段,导致生成SQL时错误地将JSON对象的子属性(lat、lng)当成了数据库列,而非将整个对象序列化为JSON字符串存入address字段。同时生成的SQL中直接传入JSON对象,不符合MySQL对JSON字段的语法要求。
解决方案
1. 在Objection模型中标记JSON字段(推荐)
在你的Person模型类里,通过jsonAttributes静态属性声明address为JSON类型,让Objection自动处理序列化/反序列化:
// person.model.ts import { Model } from 'objection'; export class Person extends Model { static tableName = 'persons'; // 声明JSON类型字段 static jsonAttributes = ['address']; id: string; address: { lat: number; lng: number }; updatedAt: Date; }
配置后,执行更新操作时Objection会自动将JS对象转为JSON字符串,生成正确的SQL。
2. 手动序列化JSON对象
如果暂时不想修改模型,可以手动将JSON对象转为字符串后传入:
this.personRepository .query() .update({ ...data, address: JSON.stringify(data.address) }) .where('id', person.id) .execute()
或者使用Knex的raw函数结合MySQL的JSON_OBJECT构造JSON值:
import { knex } from 'knex'; // 确保已导入knex实例 this.personRepository .query() .update({ address: knex.raw('JSON_OBJECT(?, ?, ?, ?)', ['lat', data.address.lat, 'lng', data.address.lng]), updatedAt: new Date() }) .where('id', person.id) .execute()
3. 验证数据库字段类型
确认persons表的address字段确实是JSON类型,可执行以下SQL检查:
DESCRIBE persons;
确保address字段的Type为json,而非VARCHAR或其他类型。
内容的提问来源于stack exchange,提问作者Willower
相关产品推荐
相关产品推荐

