[JavaScript] Knex.jsでデータを入れる

2014/12/24

こんにちは。きんくまです。

ORMのBookshelf.jsを調べてました。そしたら、Bookshelfの下ではKnex.jsというのがSQLを実際に組み立てているみたいです。

今回はそれについて。

その前にgulpでcoffee

ビルドシステムのgulpが流行っているみたいなので、使ってみました。

あと、サーバー側だとTypeScriptで型つけてかっちり書くよりは、CoffeeScriptでサクサク書いた方が良さそうな印象をもってきたので、今回はCoffeeScriptで書いてみました。

設定ファイルもCoffeeScriptで書こうとして、エラーの書き方ではまりました。
on ‘error’ってなるのが、pipeと同じ階層だと駄目で、coffee()から返ってくるところに続けてかくのに気づかなかった、、。

gulpfile.coffee

gulp   = require 'gulp'
coffee = require 'gulp-coffee'

gulp.task 'bookshelf', ->
    gulp.src './bookshelf/coffee/**/*.coffee'
        .pipe(coffee {bare:true}
            .on 'error', (err)-> 
                console.error err)
        .pipe gulp.dest './bookshelf/bin/'

pipeって何だろうと調べてみたら、Unixのパイプ | のようなものだそうです。

Knex.js

Knex.jsはSQL query builderってなっているので、SQL組み立てを担当するものです。

Bookshelf.jsはBackbone.jsに影響を受けているらしく、Backboneの下にUnderscoreがあるように、Bookshelfの下にKnexを置いたようです。

で、Bookshelfを使わなくてもKnexは単体で動かすことができて、CRUD処理を全て行えます。というか、テーブルの定義の作成とか変更はBookshelfだとできなくて、Knexを使う必要があります。

テーブル作る

テーブルを作ります。

DB.coffee

knex = require('knex')({
    client: 'sqlite3'
    connection: 
        filename: './bookshelf/bin/sample.db'
    debug:true
})

class DB
    createTables: ->
        #books
        knex.schema.hasTable('books')
            .then (exists)->
                if !exists
                    knex.schema.createTable 'books', (table)->
                        table.increments('id').primary()
                        table.string 'name'
        #summaries
            .then ->
                knex.schema.hasTable('summaries')
            .then (exists)->
                if !exists
                    knex.schema.createTable 'summaries', (table)->
                        table.increments('id').primary()
                        table.string 'details'
                        table.integer('book_id').unique().references('books.id')

本の本体と概要のテーブルを作りました。
で、それを1対1でつなぎました。これはBookshelfの関連の項目に書いてあったものを写しました。

書き方的にはPromiseがライブラリ側で提供されていて、それで全てつなげて書いています。テーブルの存在チェックして、なければ作るという流れです。
あとフィールド部分の定義もjQueryみたいに連結して書けるので面白いです。

データを入れてみる

データを入れてみます。

Amazonで2014年の理学・工学・医学・コンピュータの年間ランキングが出ていたのでそこからベスト10をjsonに入れてみました。タイトルと概要だけ入ってます。

できたjson

DB.coffee

_ = require('../../node_modules/knex/node_modules/lodash/lodash.js')
fs = require('fs')

class DB
    ...省略

    insertDatas: ->
        bookdataText = fs.readFileSync './bookshelf/bin/bookdata.json', {encoding:'utf8'}
        bookdata = JSON.parse bookdataText

        _.each bookdata, (book, index)->

            knex('books').insert {
                name: book.title
            }
            .then (ids)->
                knex('summaries').insert {
                    book_id: ids[0]
                    details: book.summary
                }

module.exports = DB

Knex.jsだとUnderscoreの互換があるLo-dashが使われていたので、そいつをrequireしてます。

insertすると、配列の中にそのidが入っているpromiseが返ってきます。次のthenでその関連のsummaryを入れました。

使うとき

main.coffee

DB = require('./DB')

db = new DB()
db.createTables()
    .then ->
        db.insertDatas()

中身を見てみる

DB.coffee

class DB
    ...省略

    find1: ->
        knex.select().from('books')
            .then (rows) ->
                console.log 'find1 --'
                _.each rows, (row)->
                    console.log row

    find2: ->
        knex.select('id', 'details').from('summaries').where 'details', 'like', '%世界%'
            .then (rows) ->
                console.log 'find2 --'
                _.each rows, (row)->
                    console.log row

    find3: ->
        knex.select().from('books').leftJoin('summaries', 'books.id', 'summaries.book_id')
            .limit(3).offset(2)
            .then (rows) ->
                console.log 'find3 --'
                _.each rows, (row)->
                    console.log row

main.coffee

DB = require('./DB')

db = new DB()

db.find1()
    .then ->
        db.find2()
    .then ->
        db.find3()
    .then ->
        console.log 'complete'

出力

% node bookshelf/bin/main.js
{ __cid: '__cid1',
  method: 'select',
  options: undefined,
  bindings: [],
  sql: 'select * from "books"' }
find1 --
{ id: 1, name: 'フェルマーの最終定理 (新潮文庫) ' }
{ id: 2, name: '宇宙が始まる前には何があったのか? ' }
{ id: 3, name: '知ろうとすること。 (新潮文庫) ' }
{ id: 4, name: '統計学が最強の学問である ' }
{ id: 5, name: 'ドミトリーともきんす ' }
{ id: 6, name: '物理のエッセンス 力学・波動 (河合塾シリーズ) ' }
{ id: 7, name: '生物と無生物のあいだ (講談社現代新書) ' }
{ id: 8, name: '物理のエッセンス 熱・電磁気・原子 (河合塾シリーズ) ' }
{ id: 9, name: 'データの見えざる手: ウエアラブルセンサが明かす人間・組織・社会の法則 ' }
{ id: 10, name: 'マンガでわかる統計学 ' }
{ __cid: '__cid1',
  method: 'select',
  options: undefined,
  bindings: [ '%世界%' ],
  sql: 'select "id", "details" from "summaries" where "details" like ?' }
find2 --
{ id: 4,
  details: 'あえて断言しよう。あらゆる学問のなかで統計学が最強の学問であると。 どんな権威やロジックも吹き飛ばして正解を導き出す統計学の影響は、現代社会で強まる一方である。 「ビッグデータ」などの言葉が流行ることもそうした状況の現れだが、はたしてどれだけの人が、その本当の魅力とパワフルさを知っているだろうか。 本書では最新の事例と研究結果をもとに、基礎知識を押さえたうえで統計学の主要6分野 ◎社会調査法 ◎疫学・生物統計学 ◎心理統計学 ◎データマイニング ◎テキストマイニング ◎計量経済学 を横断的に解説するという、今までにない切り口で統計学の世界を案内する。 ------ 統計学によって得られる最善の道を使えば、お金を儲けることも、自分の知性を磨くことも、健康になることもずいぶんと楽になるだろう。だがそれはあくまで副産物である。統計リテラシーによって手に入る最も大きな価値は、自分の人生を自分がいつでも最善にコントロールできるという幸福な実感なのだ。 (「おわりに」より)...' }
{ id: 5,
  details: '不思議な学生寮「ともきんす」。お二階には寮生さんが4人。 朝永振一郎、牧野富太郎、中谷宇吉郎、湯川秀樹…… テーマは科学者たちの言葉―高野文子最新コミックス! 高野文子が新作のテーマに選んだのは「科学者たちの言葉」でした。日本の優れた科学者たちが残した文章を、なぜいま読み返すのか。 その意義を、架空の学生寮を舞台に、「科学する人たち」と一組の母娘の交流を通じて丁寧に描いていきます。 「道具を持ち替えることから始めた」と著者が語る通り、画面を行き交う線はさらなる進化を遂げ、 フィクションとノンフィクションのあわいに、唯一無二の世界が生まれました。 本書には、Webメディア「マトグロッソ」で連載されていた表題作に加え、連載への布石となった短編 「球面世界」「Tさん(東京在住)は、この夏、盆踊りが、おどりたい。」の二篇を収録。 漫画単行本としては前作『黄色い本』から12年―大判サイズで絵の魅力をあますことなく伝えた、ファン待望の一冊です。 もくじ 球面世界 ドミトリーともきんす プロローグ 1 トモナガ君 おうどんです 朝永振一郎「鏡のなかの物理学」 2 トモナガ君 泣かないで 朝永振一郎「滞独日記(一九三八年四月七日?一九四〇年九月八日)」 3 マキノ君 お正月です 牧野富太郎「松竹梅」 4 ナカヤ君 お手紙です 中谷宇吉郎「簪を挿した蛇」 5 ナカヤ君 コタツです 中谷宇吉郎「天地創造の話」 6 マキノ君 蝶々です 牧野富太郎「なぜ花は匂うか?」 7 ユカワ君 お豆です 湯川秀樹「数と図形のなぞ」 8 ユカワ君 松ボックリです 湯川秀樹『「湯川秀樹 物理講義」を読む』 9 ...' }
{ id: 9,
  details: '人間行動の法則性が、ここまで明らかになった! 時間の使い方・組織運営・経済現象など、人間と社会に関する認識を根底からくつがえす科学的新事実。 科学としての確立と現場での応用が同時進行し、世界を変えつつある新たなサイエンスの登場を、世界の第一人者が自ら綴る! 日立製作所中央研究所で2006年に開発されたウエアラブルセンサ「ビジネス顕微鏡」による人間行動の研究が、 いま、人間・組織・社会の理解を根本から変えようとしている。 著者自身を含め、これまでのべ100万人日以上の行動を計測、その身体活動、位置情報、 センサを付けている人どうしの面会などを記録した「ヒューマンビッグデータ」が、 人間や社会に普遍的に見られる「法則」や「方程式」を次々と明らかにしているのである。 そのデータから明らかになる「法則」とはいかなるものか。 法則の理解は、私たちの生活や社会をどのように変えるのか。 世界を変えつつある新たなサイエンスの登場を、世界の第一人者が自ら綴る! 《内容より》 人間の活動は、分子の熱運動と同じ法則に従っていた 人間活動の「効率」は、熱力学の「熱効率」の式で記述できる 人間は自由だからこそ、法則に従う 職場の生産性は、会話時の身体活動の活発さに左右される 従業員の幸福感が生産性向上につながることをセンサが証明する 開発遅延の少ない組織の「ソーシャルグラフ」には特徴がある 「知り合いの知り合い」を増やすことで組織統合を成功に導く新技術 購買行動を丸ごと測定する新技術で明らかになった「買いたくさせる要素」 大量のデータを解析し自動的に仮説を構築する人工知能「H」の誕生 「ビッグデータで儲ける3原則」とは何か? 人間の学習能力を人工知能が増幅させる「ヒューマン3.0」の時代へ...' }
{ __cid: '__cid1',
  method: 'select',
  options: undefined,
  bindings: [ 3, 2 ],
  sql: 'select * from "books" left join "summaries" on "books"."id" = "summaries"."book_id" limit ? offset ?' }
find3 --
{ id: 3,
  name: '知ろうとすること。 (新潮文庫) ',
  details: '福島第一原発の事故後、情報が錯綜する中で、ただ事実を分析し、発信し続けた物理学者・早野龍五。以来、学校給食の陰膳(かげぜん)調査や子どもたちの内部被ばく測定装置開発など、誠実な計測と分析を重ね、国内外に発表。その姿勢を尊敬し、自らの指針とした糸井重里が、放射線の影響や「科学を読む力の大切さ」を早野と語る。未来に求められる「こころのありよう」とは。文庫オリジナル。...',
  book_id: 3 }
{ id: 4,
  name: '統計学が最強の学問である ',
  details: 'あえて断言しよう。あらゆる学問のなかで統計学が最強の学問であると。 どんな権威やロジックも吹き飛ばして正解を導き出す統計学の影響は、現代社会で強まる一方である。 「ビッグデータ」などの言葉が流行ることもそうした状況の現れだが、はたしてどれだけの人が、その本当の魅力とパワフルさを知っているだろうか。 本書では最新の事例と研究結果をもとに、基礎知識を押さえたうえで統計学の主要6分野 ◎社会調査法 ◎疫学・生物統計学 ◎心理統計学 ◎データマイニング ◎テキストマイニング ◎計量経済学 を横断的に解説するという、今までにない切り口で統計学の世界を案内する。 ------ 統計学によって得られる最善の道を使えば、お金を儲けることも、自分の知性を磨くことも、健康になることもずいぶんと楽になるだろう。だがそれはあくまで副産物である。統計リテラシーによって手に入る最も大きな価値は、自分の人生を自分がいつでも最善にコントロールできるという幸福な実感なのだ。 (「おわりに」より)...',
  book_id: 4 }
{ id: 5,
  name: 'ドミトリーともきんす ',
  details: '不思議な学生寮「ともきんす」。お二階には寮生さんが4人。 朝永振一郎、牧野富太郎、中谷宇吉郎、湯川秀樹…… テーマは科学者たちの言葉―高野文子最新コミックス! 高野文子が新作のテーマに選んだのは「科学者たちの言葉」でした。日本の優れた科学者たちが残した文章を、なぜいま読み返すのか。 その意義を、架空の学生寮を舞台に、「科学する人たち」と一組の母娘の交流を通じて丁寧に描いていきます。 「道具を持ち替えることから始めた」と著者が語る通り、画面を行き交う線はさらなる進化を遂げ、 フィクションとノンフィクションのあわいに、唯一無二の世界が生まれました。 本書には、Webメディア「マトグロッソ」で連載されていた表題作に加え、連載への布石となった短編 「球面世界」「Tさん(東京在住)は、この夏、盆踊りが、おどりたい。」の二篇を収録。 漫画単行本としては前作『黄色い本』から12年―大判サイズで絵の魅力をあますことなく伝えた、ファン待望の一冊です。 もくじ 球面世界 ドミトリーともきんす プロローグ 1 トモナガ君 おうどんです 朝永振一郎「鏡のなかの物理学」 2 トモナガ君 泣かないで 朝永振一郎「滞独日記(一九三八年四月七日?一九四〇年九月八日)」 3 マキノ君 お正月です 牧野富太郎「松竹梅」 4 ナカヤ君 お手紙です 中谷宇吉郎「簪を挿した蛇」 5 ナカヤ君 コタツです 中谷宇吉郎「天地創造の話」 6 マキノ君 蝶々です 牧野富太郎「なぜ花は匂うか?」 7 ユカワ君 お豆です 湯川秀樹「数と図形のなぞ」 8 ユカワ君 松ボックリです 湯川秀樹『「湯川秀樹 物理講義」を読む』 9 ...',
  book_id: 5 }
complete

設定項目でdebug:trueとしているので、SQLも出力されてます。

感想

ORMはチートすぎますねw 複雑になったときどうなるのかは想像できないですが、いまのところ簡単にDBの操作ができました。

Knexは素直にSQLの操作をオブジェクトに置き換えたように感じました。なので、SQLが書ける人はKnexをすぐに使えそうです。対してBookshelfはこのあたりの操作を抽象化してDBを操作するようなので、調べてみようと思います。

あ、でもその前に2014アニメDBはKnexだけで作れそうだから、今年が終わる前になんとかしたいです。

今回つくった2ファイル

LINEで送る
Pocket

自作iPhoneアプリ 好評発売中!
フォルメモ - シンプルなフォルダつきメモ帳
ジッピー電卓 - 消費税や割引もサクサク計算!

ページトップへ戻る