Вставьте простой JSON объект в столбец SQLite TEXT, используя C API - PullRequest
0 голосов
/ 11 марта 2020

Я хочу сохранить объект JSON в столбце TEXT, используя SQLite C API. Мой объект JSON содержит только числа, строки и логические значения, а не вложенные объекты или массивы. Моя цель состоит в том, чтобы эмулировать переменное количество столбцов.

Рассмотрим таблицу: CREATE TABLE t (i INTEGER, j TEXT);

В настоящее время я использую подготовленное утверждение, подобное этому:

const char *sql = "INSERT INTO t (j) VALUES (:1);";
sqlite3_prepare_v2(db, sql, -1, &stmt, NULL);
const char *buf = build_my_json_object(); // E.g. {"foo":101,"bar":102,"baz":103}
sqlite3_bind_text(stmt, 1, buf);

Это работает, но мне интересно, есть ли лучший способ. В частности, есть ли способ вставить объект JSON без необходимости сначала создавать JSON.

Чтобы запросить объект JSON в столбце TEXT, я нашел его очень удобным для использования json_each(), потому что тогда мне не нужен JSON парсер. Мне не хватает столь же удобного способа вставить объект JSON без сериализатора JSON.

1 Ответ

0 голосов
/ 22 марта 2020

Я отвечаю на свой вопрос, когда, наконец, нашел удовлетворительное решение.

Я решил использовать временную таблицу:

sqlite3_exec(db, "CREATE TEMP TABLE kv (k, v);", NULL, NULL, NULL);

Я заполняю временную таблицу своим JSON пары ключ / значение:

sqlite3_prepare_v2(db, "INSERT INTO kv VALUES (:1, :2);", -1, &stmt, NULL);
sqlite3_bind_text(stmt, 1, key, -1, SQLITE_STATIC);
sqlite3_bind_int(stmt, 2, value); // Bind by value type.
sqlite3_step(stmt);

Эта временная таблица затем используется для заполнения столбца j таблицы t:

sqlite3_prepare_v2(db, "INSERT INTO t (i, j) VALUES (:1, (SELECT json_group_object(k, v) FROM kv));", -1, &stmt, NULL);
sqlite3_bind_int(stmt, 1, 42); // Set value for column i.
sqlite3_step(stmt);

Вот полная последовательность SQL операторы, которые иллюстрируют подход:

CREATE TABLE t (i INTEGER, j TEXT);
CREATE TEMP TABLE kv (k, v);
INSERT INTO kv VALUES ('k1', 7);
INSERT INTO kv VALUES ('k2', 'hello');
INSERT INTO kv VALUES ('k3', 1.23);
INSERT INTO t (i, j) VALUES (42, (SELECT json_group_object(k, v) FROM kv));
SELECT * FROM t;

Выход из последнего оператора выбора - 42|{"k1":7,"k2":"hello","k3":1.23}.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...