如何自动处理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": 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' 
  } 
]