SQLiteに直接アクセスする
SQLiteはサーバを必要としないデータベースシステムであり、単一のファイルをデータベースとして扱うことができます。あらゆるOSで利用でき、ファイル1つを転送するだけで他のマシンにデータベース全体をコピーできるというポータブル性が特徴です。手軽でありながら本格的なデータベースとしての機能を備えており、SQLを使用して高速にデータを扱うことができます。
SQLiteはSequelizeから使うこともできますが、O/Rマッパーを使いたくない場合など直接アクセスするにはnode-sqlite3(BSDライセンス)というモジュールを使います。node-sqlite3をインストールするにはプロジェクトのディレクトリで次のように実行します。
$ npm install sqlite3
node-sqlite3の使い方
リスト12は、cats.dbというファイル名で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を発行し、結果を受け取る場合はコールバック関数を指定します。
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()
