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

Javascript 使用knex插入MySQL JSON列时自动字符串化对象,javascript,mysql,json,typescript,knex.js,Javascript,Mysql,Json,Typescript,Knex.js,让我们直接跳到一个示例代码: 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_

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

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)
// ]
并从表中获取如下数据:

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?或任何其他选项?

您可以尝试
objective.js
,该选项允许您声明某些列标记为json属性,这些列在插入/更新其值时应自动字符串化


不过,我还没有尝试过它是否与mysql兼容。我看不出有什么理由不这样做。

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


对于office中的此类问题,我们更喜欢postgresql,对于您的问题,我们更喜欢使用更简单、更可靠的数据库。

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


您也可以包装knex以自动完成此操作。

谢谢。我试图避免添加ORM,但似乎没有它是不可能的:(Objective非常轻量级,并不是试图掩盖您实际上在幕后使用SQL数据库的事实。它不会阻止您编写与knex类似的任何类型的SQL。它基本上只是一组挂钩和声明,使处理关系比手动编写的联接更容易。感谢您的回答,但是渴望使用不同的数据库不是我们的选择。