Sqlalchemy 使用 json_set 更新特定的 JSON 字段

Posted

技术标签:

【中文标题】Sqlalchemy 使用 json_set 更新特定的 JSON 字段【英文标题】:Sqlalchemy use json_set to update specific JSON field 【发布时间】:2019-10-06 17:26:32 【问题描述】:

我打算使用 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 形成从 'field_name'field_name 的正确字段?

【问题讨论】:

【参考方案1】:

您应该将第一个参数名称为模型传递给函数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()

【讨论】:

以上是关于Sqlalchemy 使用 json_set 更新特定的 JSON 字段的主要内容,如果未能解决你的问题,请参考以下文章

MySQL 5.7+,嵌套路径中的 JSON_SET 值

如何在 jOOQ for MySQL 8 中实现 JSON_SET()

使用 Graphene 和 SQLAlchemy 通过 GraphQL API 更新记录

使用 Marshmallow 模式过滤 sqlalchemy 表更新

使用核心 SQLAlchemy 插入和更新

SQLAlchemy 使用合并更新 PostgreSQL 数组不起作用