データベースへのアクセス
O/Rマッピング
データベースへアクセスするためのO/Rマッパーとして代表的なものにSequelize(MITライセンス)があります。Sequelizeを使うと、MySQLとSQLiteを同じAPIで扱うことができます。
プログラムにおけるインスタンスをリレーショナルデータベースのレコードに1対1で対応させて保存したり検索したりすることをO/Rマッピングと呼ぶ。O/Rマッパーとは、O/Rマッピングを行うためのライブラリやツールのこと。データベースに直接アクセスするよりも抽象的な操作ができ、大幅にソースコードの量を減らすことができる。ORMとも呼ばれる。O/RはObject-Relationalの略。
Sequelizeのインストール
Sequelizeをインストールするには、プロジェクトのディレクトリで以下のコマンドを実行します。
$ npm install sequelize
SQLiteを使う場合は、SQLite用のモジュールもインストールします。
$ npm install sqlite3
Sequelizeインスタンスの作成
Sequelizeインスタンスの作成時にデータベースへの接続情報を指定します。MySQLに接続する場合は次のように記述します。オプションの指定は任意です。
Sequelize = require 'sequelize' sequelize = new Sequelize データベース名, ユーザ名, パスワード, オプション
一方、SQLiteに接続する場合は次のようにdialect
オプションを指定します。
Sequelize = require 'sequelize' sequelize = new Sequelize '', '', '', dialect: 'sqlite' storage: 'SQLiteデータベースファイル名'
インスタンス作成時のオプション
new Sequelize
の第4引数に指定できるオプションのうち主なものは次の通りです。( )内の大文字の値はデフォルト値を意味します。例えば(TRUE/false)
と記載してある場合、そのオプションを指定しない場合はtrueを指定したものとみなされます。
- host(文字列):接続先ホスト。デフォルトはlocalhost。
- port(数値):接続先ポート。デフォルトは3306。
- logging(TRUE/false):SQLのログ出力を有効にするか。
- dialect(文字列):使用するSQL形式。mysqlまたはsqliteが指定可能。デフォルトはmysql。
- storage(文字列):SQLiteの場合にストレージとして使うファイルのパス。デフォルトはインメモリデータベース(:memory:)。
- maxConcurrentQueries(数値):データベースへの最大同時発行クエリ数。デフォルトは50。
例えば、192.168.1.1の3307番ポートで稼働しているMySQLに接続するには次のように記述します。
sequelize = new Sequelize 'database', 'username', 'password', host: '192.168.1.1' port: 3307
モデルの定義
データベースにアクセスするには、まずデータを表すモデルを定義します。モデル1つはデータベースのテーブル1つに相当します。モデルの定義はsequelize.define(テーブル名, カラム一覧, オプション)
で行います。オプションの指定は任意です。カラム一覧はオブジェクトで渡し、キーとしてカラム名(列名)を、値としてデータ型を指定します。例えば、firstName
、lastName
、dateOfBirth
という3つのフィールドを持つPerson
モデルを定義するにはリスト1のように記述します。
Person = sequelize.define 'Person', firstName: Sequelize.STRING lastName: Sequelize.STRING dateOfBirth: Sequelize.DATE
データ型は表1のものが使用できます。
Sequelizeの型 | 対応するMySQLの型 |
Sequelize.STRING | VARCHAR(255) |
Sequelize.TEXT | TEXT |
Sequelize.INTEGER | INTEGER |
Sequelize.DATE | DATETIME |
Sequelize.BOOLEAN | TINYINT(1) |
Sequelize.FLOAT | FLOAT |
sequelize.define()
の第3引数にオプションを指定する場合は次のように記述します。
Person = sequelize.define 'Person', # カラム一覧 firstName: Sequelize.STRING lastName: Sequelize.STRING dateOfBirth: Sequelize.DATE , # オプション paranoid: true underscored: true
この第3引数には以下のオプションを指定できます。指定はすべて任意です。
- classMethods(オブジェクト):モデルのクラスメソッド(後述)。
- instanceMethods(オブジェクト):モデルのインスタンスメソッド(後述)。
- timestamps(TRUE/false):タイムスタンプ用のカラム(updatedAt、createdAt)を作成するか。
- paranoid(true/FALSE):trueを指定した場合、レコード削除時に実体を削除せずdeletedAtを設定する。timestampsオプションがtrueの場合のみ機能する。一般的にSoft Deleteと呼ばれる機能。
- underscored(true/FALSE):trueを指定した場合、自動的に追加されるカラムの名前でキャメルケースの代わりにアンダースコアを使う。例えばupdatedAtの代わりにupdated_atというカラム名になる。
- freezeTableName(true/FALSE):trueを指定した場合、テーブル名を複数形に変換せず、プログラム内で記述された通りの名前を使う。