如何自动处理sqlite导出以获得反映关系数据库的JSON?
How to automatically process sqlite export to get JSON that reflect relations DB?
我正在从 sqlite database(此处别无选择)导出数据,以便为 AngulaJS 应用程序生成 JSON。
JSON 从 SQLite 导出
sqlite3
CSV 导出扁平化关系结构并添加重复项:
[
{
"bid": 5, // book id
"aid": 4, // author's id
"tags": 3,
"title": "Jacques le fataliste et son maître",
},
{
"bid": 5,
"aid": 23, // same book another author
"tags": 8, // same book another tag
"title": "Jacques le fataliste et son maître",
}
…
]
SQLite 到 JSON 命令
sqlite database 在 github 上可用,我用于 export/convert 的命令是:
sqlite3 -csv -header app/data/data.sqlite3 \
"SELECT b.id as bid, title, b.sort as sort_book, a.id as aid, a.sort as sort_author, path, name FROM books as b inner join books_authors_link as b_a ON b.id = b_a.book INNER JOIN authors as a ON a.id = b_a.author" \
| ./node_modules/csvtojson/bin/csvtojson \
> authors-books.json
JSON 目标
我以面向文档的方式与我的客户一起设计了最终的 JSON:
- 所有我需要的一个对象;
- 引用其他资源作为
- 外键的id/主键;
- 用于多对多关系的_id_s/主键列表。
这里有一个例子:我的目标:
[
{
"id": 2,
"authors": [4, 23],
"tags": [3,8,29,69],
"title": "Jacques le fataliste et son maître",
…
}
…
]
如果你说法语,这里是 github issue from the project
问题
那么如何使用命令行管道或基于 javascript 的工具获得此结果?
使用 jq
,你可以做到这一点。
按键 bid
(可能 title
)对项目进行分组,并聚合作者和标签。
group_by(.bid) |
map({
bid: .[0].bid,
title: .[0].title,
authors: map(.aid),
tags: map(.tags)
})
在节点中使用您的数据和这段代码似乎可以解决问题。它使用 lodash(更好的 underscore.js),我希望它符合你所说的基于 javascript 的工具:)
var _ = require('lodash');
var arrayFields = [
'aid'
];
var keysMap = {
id: 'bid',
authors: 'aid',
tags: 'tags',
title: 'title'
};
var result = _(rows)
.groupBy('bid') // group the rows by id
.map(function(rows) {
// for each group, take the first instance of the row as a basis
var row = _.clone(_.first(rows));
// and collect all grouped row values for the interesting fields
_.forEach(arrayFields, function(key) {
row[key] = _.pluck(rows, key);
})
return row;
})
.map(function(row) {
var obj = {};
// build a row object with translated keys
_.forEach(keysMap, function(originalKey, targetKey) {
obj[targetKey] = row[originalKey];
});
return obj;
})
.value();
console.log(result);
这是输出:
[
{
id: 5,
authors: [ 4, 23 ],
tags: 3,
title: 'Jacques le fataliste et son maître'
}
]
我正在从 sqlite database(此处别无选择)导出数据,以便为 AngulaJS 应用程序生成 JSON。
JSON 从 SQLite 导出
sqlite3
CSV 导出扁平化关系结构并添加重复项:
[
{
"bid": 5, // book id
"aid": 4, // author's id
"tags": 3,
"title": "Jacques le fataliste et son maître",
},
{
"bid": 5,
"aid": 23, // same book another author
"tags": 8, // same book another tag
"title": "Jacques le fataliste et son maître",
}
…
]
SQLite 到 JSON 命令
sqlite database 在 github 上可用,我用于 export/convert 的命令是:
sqlite3 -csv -header app/data/data.sqlite3 \
"SELECT b.id as bid, title, b.sort as sort_book, a.id as aid, a.sort as sort_author, path, name FROM books as b inner join books_authors_link as b_a ON b.id = b_a.book INNER JOIN authors as a ON a.id = b_a.author" \
| ./node_modules/csvtojson/bin/csvtojson \
> authors-books.json
JSON 目标
我以面向文档的方式与我的客户一起设计了最终的 JSON:
- 所有我需要的一个对象;
- 引用其他资源作为
- 外键的id/主键;
- 用于多对多关系的_id_s/主键列表。
这里有一个例子:我的目标:
[
{
"id": 2,
"authors": [4, 23],
"tags": [3,8,29,69],
"title": "Jacques le fataliste et son maître",
…
}
…
]
如果你说法语,这里是 github issue from the project
问题
那么如何使用命令行管道或基于 javascript 的工具获得此结果?
使用 jq
,你可以做到这一点。
按键 bid
(可能 title
)对项目进行分组,并聚合作者和标签。
group_by(.bid) |
map({
bid: .[0].bid,
title: .[0].title,
authors: map(.aid),
tags: map(.tags)
})
在节点中使用您的数据和这段代码似乎可以解决问题。它使用 lodash(更好的 underscore.js),我希望它符合你所说的基于 javascript 的工具:)
var _ = require('lodash');
var arrayFields = [
'aid'
];
var keysMap = {
id: 'bid',
authors: 'aid',
tags: 'tags',
title: 'title'
};
var result = _(rows)
.groupBy('bid') // group the rows by id
.map(function(rows) {
// for each group, take the first instance of the row as a basis
var row = _.clone(_.first(rows));
// and collect all grouped row values for the interesting fields
_.forEach(arrayFields, function(key) {
row[key] = _.pluck(rows, key);
})
return row;
})
.map(function(row) {
var obj = {};
// build a row object with translated keys
_.forEach(keysMap, function(originalKey, targetKey) {
obj[targetKey] = row[originalKey];
});
return obj;
})
.value();
console.log(result);
这是输出:
[
{
id: 5,
authors: [ 4, 23 ],
tags: 3,
title: 'Jacques le fataliste et son maître'
}
]