【问题标题】:Insert simple JSON object into SQLite TEXT column using C API使用 C API 将简单的 JSON 对象插入 SQLite TEXT 列
【发布时间】:2020-06-23 02:51:37
【问题描述】:

我想使用 SQLite C API 将 JSON 对象存储在 TEXT 列中。我的 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。

要查询 TEXT 列中的 JSON 对象,我发现使用 json_each() 非常方便,因为这样我就不需要 JSON 解析器了。我缺少一种同样方便的方式来插入 JSON 对象,而无需 JSON 序列化程序。

【问题讨论】:

    标签: c json sqlite


    【解决方案1】:

    我回答了我自己的问题,因为我终于找到了一个令人满意的解决方案。

    我决定使用临时表:

    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);
    

    此临时表随后用于填充表tj 列:

    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}

    【讨论】:

      猜你喜欢
      • 2018-03-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-02-24
      • 2013-10-29
      • 1970-01-01
      • 2020-06-21
      相关资源
      最近更新 更多