javascript - Hoe knex JSON laten gebruiken in sqlite?
Stel dat ik een database heb, die een specifieke "mock" is voor testdoeleinden, dus een op geheugen gebaseerde sqlite-database -- terwijl de hoofd database postgres gebruikt:
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();
});
Wanneer ik kolominformatie oproep op deze await theDb.table('test').columnInfo();
dit is het antwoord:
{
"id":{"type":"integer","maxLength":null,"nullable":false,"defaultValue":null},
"json_test":{"type":"json","maxLength":null,"nullable":true,"defaultValue":null}
}
Maar wanneer ik probeer een insert-ophaal-cirkel zo te doen:
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);
Het resultaat is: [{id: 1, test_json: null}];. Dit lijkt aan te geven dat de json niet is opgeslagen? Het afdrukken van de query met "toString()" laat zien dat het de json wel in de waarden zet:
insert into `test` (`id`, `test_json`) values (1, {"abc":10,"def":"hello","ghi":20})
Ik merk dat SQLITE standaard geen ondersteuning voor JSON heeft, maar er is een ondersteunde JSON-extensie voor SQLite: https://www.sqlite.org/json1.html
Dus hoe zou ik tegen knex zeggen: 'json is prima, gebruik gewoon de extensie'? Of heeft iemand een ander idee waar ik json kan gebruiken zonder dat de code crasht tijdens tests? De rest van de code is afhankelijk van JSON en het zou een beetje gek zijn om het overal te veranderen naar text/JSON serialisatie 'als het tijdens het testen wordt uitgevoerd'.