首页 > 解决方案 > 如何让 knex 在 sqlite 中使用 JSON?

问题描述

好吧,说我有一个数据库,它是一个用于测试目的的特定“模拟”,因此是一个基于内存的 sqlite 数据库——主数据库在哪里使用 postgres:

import knexBuilder = require("knex");
const theDb = knexBuilder({
    client: 'sqlite3',
    connection: {
        filename: ":memory:"
    },
    useNullAsDefault: true,
    pool: {
        min: 1,
        max: 1,
        idleTimeoutMillis: 360000 * 1000
    },
});
await theDb.schema.createTable("test", (table) => {
    table.increments('id');
    table.json("json_test").nullable();
});

当我为此调用列信息时await theDb.table('test').columnInfo();

这是回应:

{
    "id":{"type":"integer","maxLength":null,"nullable":false,"defaultValue":null},
    "json_test":{"type":"json","maxLength":null,"nullable":true,"defaultValue":null}
}

但是,当我尝试像这样进行插入检索循环时:

await theDb.insert({
    id: 1,
    test_json: {
        "abc": 10,
        "def": "hello",
        "ghi": 20,
    },
}).into("test");
const retrieved = await theDb.select('id', 'test_json').from('test').where('id', 1);

结果是:[{id: 1, test_json: null}];。这似乎表明没有存储json?使用“toString()”打印查询表明它确实将 json 放入了值中:

insert into `test` (`id`, `test_json`) values (1, {"abc":10,"def":"hello","ghi":20})

我注意到 SQLITE 默认不支持 JSON,但是 SQLite 支持 JSON 扩展:https ://www.sqlite.org/json1.html

那么我如何告诉 knex “json 很好,只需使用扩展名”?或者我可以在不破坏代码的情况下使用 json 进行测试的任何其他想法?其余代码依赖于 JSON,如果“如果在测试期间运行”,则到处更改以使用文本/JSON 序列化会有点愚蠢。

标签: javascriptjsontypescriptsqliteknex.js

解决方案


推荐阅读