You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.29 14:17:16