[英]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.