繁体   English   中英

使用 knex 插入 MySQL JSON 列时自动字符串化对象

[英]Automatically stringifying object when inserting to a MySQL JSON column with knex

让我们直接跳到示例代码:

create table test_json_table
(
    data json not null
);

我可以像这样插入到表中:

const columns = { data: "{ some_json: 123 }" }; // notice that the data column is passed as string
await knex('test_json_table').insert(columns);

并从表中获取数据,如下所示:

await knex('test_json_table').select();
// returns:
// [ 
//   { data: { some_json: 123 } } // notice that the data is returned as parsed JavaScript object (not a string)
// ]

插入一行时,JSON 列需要作为序列化字符串传递。 检索行时,将返回一个已解析的对象。

这在项目中造成了相当大的混乱。 我们正在使用 TypeScript 并希望插入和选择具有相同的类型,但这使得它不可能。 要么总是有字符串,要么总是反对。

我发现在其他地方正在讨论这个话题,所以看起来我并不孤单(链接链接)。 似乎没有办法自动将对象转换为字符串。 或者我错过了什么?

如果 knex 提供一个钩子,我们可以在插入时手动将对象序列化为字符串,那就太好了。

实现这一目标的最简单方法是什么? 是否有任何轻量级ORM 支持? 或者有其他选择吗?

您可以尝试使用objection.js ,它允许您声明某些要标记为json属性的列,并且在插入/更新其值时应自动将其字符串化https://vincit.github.io/objection.js/api/model/static -properties.html#static-json属性

我还没有尝试过它是否可以与mysql一起使用。 我看不出为什么不会。

我认为使用jsonb数据类型的最简单方法。 mysql json类型

对于办公室中的此类问题,我们更喜欢使用postgresql,对于您的问题,更易于使用的数据库是可靠的。

好吧,您可以在插入之前调用自己的函数,该函数会将所有对象转换为字符串,并在每次插入之前都调用它。

您可能还可以包装knex以使其自动执行。

我认为您需要找到更好的ORM,例如续集

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM