如果我有一些示例数据,如何将其放入SQLite(最好是全自动的)中?
{"uri":"/","user_agent":"example1"}
{"uri":"/foobar","user_agent":"example1"}
{"uri":"/","user_agent":"example2"}
{"uri":"/foobar","user_agent":"example3"}
Run Code Online (Sandbox Code Playgroud)
mm2*_*001 13
一种方法做到这一点没有CSV或第三方工具是使用JSON1扩展的SQLite与组合readfile扩展了在所提供的sqlite3命令行工具。
如果输入文件是格式良好的 JSON 文件,例如作为数组给出的示例:
[
{"uri":"/","user_agent":"example1"},
{"uri":"/foobar","user_agent":"example1"},
{"uri":"/","user_agent":"example2"},
{"uri":"/foobar","user_agent":"example3"}
]
Run Code Online (Sandbox Code Playgroud)
然后可以将其读入相应的my_table表中,如下所示。my_db.db使用 sqlite3 CLI打开 SQLite 数据库文件:
sqlite3 my_db.db
Run Code Online (Sandbox Code Playgroud)
然后创建my_table使用:
sqlite3 my_db.db
Run Code Online (Sandbox Code Playgroud)
最后,my_data.json可以使用 CLI 命令将 JSON 数据插入到表中:
CREATE TABLE my_table(uri TEXT, user_agent TEXT);
Run Code Online (Sandbox Code Playgroud)
除了总体上是一个“更直接”的解决方案外,这还具有比 CSV 更一致地处理 JSON NULL 值的优点,否则将它们作为空字符串导入。
如果初始 JSON 文件是换行符分隔的 JSON 元素,则可以先使用以下方法进行转换jq:
jq -s <my_data_raw.json >my_data.json
Run Code Online (Sandbox Code Playgroud)
很可能有一种方法可以使用 JSON1 在 SQLite 中直接执行此操作,但鉴于我已经使用jq在导入 SQLite 之前对数据进行处理,因此我没有继续这样做。
我发现最简单的方法是使用jq和CSV作为中间格式。
编辑:如所指出的(感谢@Leo),原始问题确实显示了以换行符分隔的JSON对象,每个对象都各自符合rfc4627,但并非全部以该格式结合在一起。
通过使用预处理文件,jq可以处理对象的单个JSON数组,其处理方式几乎相同jq '.[]' <input.json >preprocessed.json。如果您碰巧正在处理JSON文本序列(rfc7464),幸运的是jq也支持该--seq参数。
首先将数据写入文件。我将在这里假设data.json。
然后使用jq以下命令构造标题:
% head -1 data.json | jq -r 'keys | @csv'
"uri","user_agent"
Run Code Online (Sandbox Code Playgroud)
这head -1是因为我们只需要一行。
jq的-r使输出为纯字符串,而不是包装CSV的JSON-String。然后,我们调用内部函数keys以数组的形式获取输入的键。我们将其发送给@csv格式化程序,该格式化程序输出一个带有引号CSV格式的标头的字符串。
然后,我们需要构造数据。
% jq -r '[.[]] | @csv' < data.json
"/","example1"
"/foobar","example1"
"/","example2"
"/foobar","example3"
Run Code Online (Sandbox Code Playgroud)
现在,我们使用整个输入并使用来解构关联数组(map).[],然后将其放回简单数组中[…]。这基本上将我们的字典转换为键数组。发送给@csv格式化程序后,我们再次获得一些CSV。
综上所述,我们得到一个单线形式:
% (head -1 data.json | jq -r 'keys | @csv' && jq -r '[.[]] | @csv' < data.json) > data.csv
Run Code Online (Sandbox Code Playgroud)
如果您需要即时转换数据,即没有文件,请尝试以下操作:
% cat data.json | (read -r first && jq -r '(keys | @csv),( [.[]] | @csv)' <<<"${first}" && jq -r '[.[]] | @csv')
Run Code Online (Sandbox Code Playgroud)
打开一个SQLite数据库:
sqlite3 somedb.sqlite
Run Code Online (Sandbox Code Playgroud)
现在,在交互式外壳程序中执行以下操作(假设您将CSV写到data.csv并希望在名为的表中进行my_table):
.mode csv
.import data.csv my_table
Run Code Online (Sandbox Code Playgroud)
现在,关闭外壳,然后再次将其打开以提供清洁的环境。您现在可以轻松地SELECT从数据库中执行任何操作。
在那里有一个腹水记录:
sqlitebiter 似乎提供了一个 python 解决方案:
将 CSV/Excel/HTML/JSON/LTSV/Markdown/SQLite/TSV/Google-Sheets 转换为 SQLite 数据库文件的 CLI 工具。http://sqlitebiter.rtfd.io/
文档:http : //sqlitebiter.readthedocs.io/en/latest/
项目:https : //github.com/thombashi/sqlitebiter
小智 6
您可以使用spyql。pyql 读取 json 文件(每行 1 个 json 对象)并生成可以通过管道传输到 sqlite 中的 INSERT 语句:
$ spyql -Otable=my_table "SELECT json->uri, json->user_agent FROM json TO sql" < sample3.json | sqlite3 my.db
Run Code Online (Sandbox Code Playgroud)
这假设您已经在 sqlite 数据库中创建了一个空表my.db。
免责声明:我是spyql的作者。