首页 > 解决方案 > Sqlalchemy 使用 json_set 更新特定的 JSON 字段

问题描述

我打算使用func函数来更新 Sqlalchemy 中的特定 JSON 字段,但我遇到了一些问题,这是我更新字段的代码:

self.db.query(TestModel).filter(TestModel.test_id == self._test_id).update(
    {field_name: func.json_set(
        field_name,
        "$." + key,
        formatted_val)}
    , synchronize_session='fetch'
)
self.db.commit()

我运行了上面的代码并得到了错误:

sqlalchemy.exc.OperationalError: (sqlite3.OperationalError) malformed JSON

于是,我去查看日志,发现 Sqlalchemy 形成了一个这样的 SQL 子句:

UPDATE test_model SET field_name=json_set('field_name', '$.keyname', 'value') WHERE test_model.test_id = 1;

问题是 Sqlalchemy 不应该使用'field_name'特定的字段来指定它应该使用field_name的特定字段,我尝试在 sql 客户端中运行以下更正的 sql 子句:

UPDATE test_model SET field_name=json_set(field_name, '$.keyname', 'value') WHERE test_model.test_id = 1;

它可以找到

我只想知道如何使 Sqlalchemy 形成正确的字段 from 'field_name'to field_name

标签: sqljsonsqlitesqlalchemymysql-json

解决方案


您应该将带有模型名称的第一个参数传递给函数func.json_set

self.db.query(TestModel).filter(TestModel.test_id == self._test_id).update(
    {field_name: func.json_set(
        TestModel.field_name,
        "$." + key,
        formatted_val)}, 
     synchronize_session='fetch'
)
self.db.commit()

推荐阅读