SQLite现在有一个实验性的JSON1扩展来使用JSON字段.可供选择的函数看起来很有前途,但我不知道如何在查询的上下文中使用它们.
假设我创建了下表:
sqlite> create table user(name,phone);
sqlite> insert into user values('oz', json_array(['+491765','+498973']));
Run Code Online (Sandbox Code Playgroud)
该文档显示了如何json_each在查询中使用,但所有其他函数在上下文文档中缺少一些.
具有SQLite经验的人可以提供一些如何使用的示例:
json_extractjson_set我想在Python中使用SQLite的json1扩展.根据官方文档,它应该是可加载的扩展.我从源代码获得了json1.c文件,并按照官方说明将其编译成json1.so,没有任何错误.
$ gcc -g -fPIC -shared json1.c -o json1.so
Run Code Online (Sandbox Code Playgroud)
当我尝试根据sqlite3文档在Python 2.7.12(和3.5.2)中加载扩展时出现问题.
>>> import sqlite3
>>> con = sqlite3.connect(":memory:")
>>> con.enable_load_extension(True)
>>> con.load_extension("./json1.so")
Run Code Online (Sandbox Code Playgroud)
我收到以下回溯错误消息.我从文件夹中运行了Python解释器,其中包含json1.so文件.即使由于最后一个冒号似乎应该有更多信息,以下是完整的错误消息.
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
sqlite3.OperationalError: error during initialization:
Run Code Online (Sandbox Code Playgroud)
实际上不可能在Python中使用json1作为可加载扩展吗?我是唯一一个重新编译SQLite,pysqlite2等的选项,正如Charles Leifer 在这篇博客文章中所解释的那样?
编辑:
事实证明,我收到了错误,因为我的机器已经启用了此功能和其他扩展功能.启用已启用的扩展的操作会触发错误.到目前为止,我可以访问的所有Linux计算机已经在Python附带的SQLite中启用了json1和fts5扩展.您可以通过连接到SQLite数据库并运行以下查询来检查已使用的编译选项.
PRAGMA compile_options;
Run Code Online (Sandbox Code Playgroud) 我已经通过brew安装了带有JSON1的SQLite3:
brew install sqlite3 --with-json1 --with-fts5
Run Code Online (Sandbox Code Playgroud)
版本:
3.15.2 2016-11-28 19:13:37 bbd85d235f7037c6a033a9690534391ffeacecc8
Run Code Online (Sandbox Code Playgroud)
运行查询时,某些函数可以正常工作,例如json_extract:
sqlite> SELECT json_extract(Body, '$.issue.fields.labels') FROM Event WHERE json_extract(Body, '$.issue.fields.labels') != '[]';
["foo","bar","baz"]
Run Code Online (Sandbox Code Playgroud)
但是,当我尝试使用json_eachor时json_tree,它失败了:
sqlite> SELECT json_each(Body, '$.issue.fields.labels') FROM Event WHERE json_extract(Body, '$.issue.fields.labels') != '[]';
Error: no such function: json_each
Run Code Online (Sandbox Code Playgroud)
Body表中的字段是Event有效的 JSON 字符串:
{"issue":{"fields":{"labels": ["foo","bar","baz"]}}}
Run Code Online (Sandbox Code Playgroud)
并且该labels值是一个数组。
我已阅读文档(并查看了json_each 示例),搜索了互联网,但找不到任何其他要求来启用此功能。
我做错了什么,或者:我如何从 json_each/json_tree 中获益?
SQLite JSON1 扩展有一些非常巧妙的功能。但是,我无法弄清楚如何更新或插入单个 JSON 属性值。
这是一个例子
CREATE TABLE keywords
(
id INTEGER PRIMARY KEY,
lang INTEGER NOT NULL,
kwd TEXT NOT NULL,
locs TEXT NOT NULL DEFAULT '{}'
);
CREATE INDEX kwd ON keywords(lang,kwd);
Run Code Online (Sandbox Code Playgroud)
我使用此表来存储关键字搜索并记录对象中启动搜索的位置locs。此数据库表中的示例条目如下所示
id:1,lang:1,kwd:'stackoverflow',locs:'{"1":1,"2":1,"5":1}'
Run Code Online (Sandbox Code Playgroud)
这里的位置对象属性是存储在其他地方的实际位置的索引。
现在想象一下以下场景
stackoverflow从位置索引“2”开始搜索。在这种情况下,我只想增加该索引处的值,以便在操作之后相应的行读取
id:1,lang:1,kwd:'stackoverflow',locs:'{"1":1,"2": 2 ,"5":1}'
从先前未知的位置索引“7”开始搜索stackoverflow,在这种情况下,更新后的相应行必须读取
id:1,lang:1,kwd:'stackoverflow',locs:'{"1":1,"2":1,"5":1, "7":1 }'
我不清楚这实际上是否可以做到。我尝试了一些类似的事情
UPDATE keywords json_set(locs,'$.2','2') WHERE kwd = 'stackoverflow';
Run Code Online (Sandbox Code Playgroud)
这给出了错误消息error near json_set。我非常感谢任何能够告诉我如何/是否应该/可以完成此操作的人。
假设我们有一个 SQLite 表,其中 id=number 且 Tags=text:
| id | tags |
| ---- | ------------------- |
| 1 | ["love","sadness"] |
| 2 | ["love"] |
| 3 | ["happiness","joy"] |
Run Code Online (Sandbox Code Playgroud)
有没有办法只返回单元格tags包含“love”的行,例如MySQL中的这个命令:SELECT * from my_table WHERE JSON_CONTAINS(tags, '"love"')在SQLite中。
sql.js我将其与Node.js库一起使用
create table store (id integer primary key, name text);
create table opening (store integer references store(id),
wday text, start integer, end integer);
insert into store (name) values ('foo'), ('bar');
insert into opening (store, wday, start, end)
values (1, 'mon', 0, 60),
(1, 'mon', 60, 120),
(1, 'tue', 180, 240),
(1, 'tue', 300, 360),
(2, 'wed', 0, 60),
(2, 'wed', 60, 120),
(2, 'thu', 180, 240);
Run Code Online (Sandbox Code Playgroud)
我正在尝试以 JSON 形式按工作日获取所有商店及其各自的营业时间。
{
"1": {
"name": "foo",
"openings": {
"mon": [ [ 0, 60 …Run Code Online (Sandbox Code Playgroud) From the sqlite3 doc
select json_insert('{"a":2,"c":4}', '$.e', 99) -- ? '{"a":2,"c":4,"e":99}'
Run Code Online (Sandbox Code Playgroud)
But how to append a new element to an array?
select json_insert('[1,2,3]', ??, 4) -- ? '[1, 2, 3, 4]'
update someTable set someArray = json_insert(someArray, ??, 'some new value')
Run Code Online (Sandbox Code Playgroud) 在我的 Flutter 应用程序中,我使用 sqflite 与本地数据库进行通信。我需要查看 JSON 数据。JSON1扩展非常适合此目的。但是,我无法在 Flutter 应用程序中加载该扩展以使其在我的查询中可用,因为该文档适用于 C,而不是 Dart。
也欢迎为 Flutter 提供其他良好支持的本地数据库(文档数据库或支持 JSON 查询的数据库)的建议。我研究了 Couchbase Lite,但插件(Fluttercouch、couchbase-lite-flutter)仍在开发中。
我有一个 sqlite 数据库,并且在其中一个字段中存储了完整的 json 对象。我必须做一些 json 选择请求。如果您看到我的 json,则 ALL 键的值是一个数组。我们需要提取一些数据,例如“pod”字段为 fb 的所有评论。当sqlite json具有数组值时如何正确提取?
从数据表中选择 json_extract(data,'$."json"') ;给了我全部的东西。然后我选择 json_extract(data,'$."json"[0]') 但我不想手动执行。我想迭代。
请建议一些我可以学习和工作的来源。 我的 JSON
{
"ALL": [{
"comments": "your site is awesome",
"pod": "passcode",
"originalDirectory": "case1"
},
{
"comments": "your channel is good",
"data": ["youTube"],
"pod": "library"
},
{
"comments": "you like everything",
"data": ["facebook"],
"pod": "fb"
},
{
"data": ["twitter"],
"pod": "tw",
"ALL": [{
"data": [{
"codeLevel": "3"
}],
"pod": "mo",
"pod2": "p"
}]
}
]
}
create …Run Code Online (Sandbox Code Playgroud) 如何使用 json_extract 来查看数组中的所有对象?如果您知道密钥,它就可以工作,但我想查看每个对象并找到匹配的对象。
$.features[0].properties.TMPRIV_ID
Run Code Online (Sandbox Code Playgroud)
如何让这个工作?
$.features[*].properties.TMPRIV_ID
Run Code Online (Sandbox Code Playgroud) 是否存在使用JSON1扩展编译的Linux/Ubuntu的SQLite发行版.SQLite JSON1页面上的说明只解释了如何在编译后加载扩展 - 我想避免的题外话.
sqlite ×11
sqlite-json1 ×11
json ×5
dart ×1
flutter ×1
javascript ×1
node.js ×1
python ×1
sql ×1
sql-update ×1