SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

DeveloperZine(デベロッパージン)- エンジニアの意思決定を支える技術情報メディア ProductZine

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

CoffeeScriptによるモダンなWebアプリケーション開発

CoffeeScriptベストプラクティス集
Node.jsアプリケーション編(3)

CoffeeScriptによるモダンなWebアプリケーション開発 第5回

SQLiteに直接アクセスする

 SQLiteはサーバを必要としないデータベースシステムであり、単一のファイルをデータベースとして扱うことができます。あらゆるOSで利用でき、ファイル1つを転送するだけで他のマシンにデータベース全体をコピーできるというポータブル性が特徴です。手軽でありながら本格的なデータベースとしての機能を備えており、SQLを使用して高速にデータを扱うことができます。

 SQLiteはSequelizeから使うこともできますが、O/Rマッパーを使いたくない場合など直接アクセスするにはnode-sqlite3(BSDライセンス)というモジュールを使います。node-sqlite3をインストールするにはプロジェクトのディレクトリで次のように実行します。

$ npm install sqlite3

node-sqlite3の使い方

 リスト12は、cats.dbというファイル名でSQLiteデータベースを作成し、レコードを挿入し、データを検索して表示します。

[リスト12]SQLiteを直接操作する
sqlite3 = require('sqlite3').verbose()
db = new sqlite3.Database 'cats.db'

db.serialize ->
  # namesテーブルがなければ作成する
  db.run "CREATE TABLE IF NOT EXISTS names (name TEXT)"

  # レコードを挿入する
  stmt = db.prepare "INSERT INTO names VALUES (?)"
  stmt.run 'タマ'
  stmt.run 'マイケル'
  stmt.finalize()

  # namesテーブルの全レコードを取得して表示する
  db.all "SELECT rowid AS id, name FROM names", (err, rows) ->
    for row in rows
      console.log "[#{row.id}] #{row.name}"

# データベースへの接続を閉じる
db.close()
実行結果
[1] タマ
[2] マイケル

 SQLiteはプロトタイプ開発などに使われることが多いものの、高速性やチューニングの柔軟性はMySQLに比べて劣るため、商用の本番運用ではあまり使われません。

 Sequelizeを使えば接続パラメータを変更するだけでSQLiteとMySQLを切り替えられるので、SQLiteの機能を直接使う必要がなければSequelizeを介してSQLiteを使う方がよいでしょう。

MySQLにアクセスする

 MySQLはSequelizeから使うこともできますが、直接アクセスするにはnode-mysql(MITライセンス)というモジュールを使います。node-mysqlをインストールするにはプロジェクトのディレクトリで次のコマンドを実行します。

$ npm install mysql

node-mysqlの使い方

 リスト13は、テーブルを新たに作成し、データを挿入して、検索した結果を表示します。client.query()でSQLを発行し、結果を受け取る場合はコールバック関数を指定します。

[リスト13]MySQLを直接操作する
mysql = require 'mysql'

username = 'username'     # MySQLのユーザー名
password = 'password'     # MySQLのパスワード
database = 'music'        # データベース名
table    = 'songs'        # テーブル名

client = mysql.createClient
  user: username
  password: password

# SQLを発行する
client.query "USE #{database}"

client.query "DROP TABLE IF EXISTS #{table}"

client.query "
  CREATE TABLE #{table} (
    id INT PRIMARY KEY AUTO_INCREMENT,
    title VARCHAR(255),
    artist VARCHAR(255),
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
  )
"

client.query "INSERT INTO #{table} (title, artist) VALUES (?, ?), (?, ?)",
  [ "A Hard Day's Night", "The Beatles"
    "Night and Day",      "Cole Porter" ]

# SQLを発行し、結果をコールバックで受け取る
client.query "SELECT * FROM #{table}", (err, songs, fields) ->
  # SQLにエラーがあった場合などはerrに値が入る
  throw err if err

  # songsはオブジェクトの配列。配列の各要素は1つのレコードを表す。
  for song in songs
    console.log "#{song.title} by #{song.artist}"

  # MySQLへの接続を切断する
  client.end()

次のページ
Redisにアクセスする

この記事は参考になりましたか?

CoffeeScriptによるモダンなWebアプリケーション開発連載記事一覧

もっと読む

この記事の著者

飯塚 直(イイヅカ ナオ)

1984年東京都生まれ。 高校時代に趣味でPerlやJavaを使ってプログラミングを始める。 慶応大学湘南藤沢キャンパス卒業後、共同通信社にてニュースサイトの開発などを担当。 その後、面白法人カヤックにてソーシャルゲームの開発などを手がける。 2012年現在、カヤックを退社し個人として活動し...

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

CodeZine(コードジン)
https://codezine.jp/article/detail/6529 2012/05/02 14:00

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー