Sequelizeは、Node.js用の強力なORM(Object Relational Mapper)であり、リレーショナルデータベース(RDBMS)との連携を簡単に行うことができます。Sequelizeを使用すると、SQLの知識がなくても、JavaScriptのオブジェクト指向プログラミングを用いてデータベース操作を行うことができます。この完全かつ包括的な記事では、Sequelizeを使用してリレーショナルデータベースを操作する方法を詳しく解説します。
Sequelizeの基本概念とインストール方法
Sequelizeは、MySQL、PostgreSQL、SQLite、MariaDB、Microsoft SQL Serverなど、さまざまなリレーショナルデータベースに対応しています。まず、Sequelizeをプロジェクトにインストールする必要があります。
インストール
Sequelizeをインストールするには、以下のコマンドを使用します:
bashnpm install sequelize
さらに、データベースドライバ(例えば、MySQLの場合)は別途インストールする必要があります。MySQLの例を挙げると、次のようにインストールします。
bashnpm install mysql2
これで、SequelizeとMySQLのセットアップが完了しました。
データベース接続の設定
次に、Sequelizeを使用してデータベースに接続します。接続設定を行うためには、new Sequelize()
を使用します。接続先のデータベース、ユーザー名、パスワードを指定する必要があります。
javascriptconst { Sequelize } = require('sequelize');
// Sequelizeのインスタンスを作成
const sequelize = new Sequelize('データベース名', 'ユーザー名', 'パスワード', {
host: 'ホスト名', // 通常は localhost または IPアドレス
dialect: 'mysql' // 使用するデータベースの種類
});
// 接続テスト
async function testConnection() {
try {
await sequelize.authenticate();
console.log('接続成功');
} catch (error) {
console.error('接続エラー:', error);
}
}
testConnection();
このコードを実行することで、データベースへの接続が正常かどうか確認できます。
モデルの定義
Sequelizeでは、データベースのテーブルをモデルとして定義します。モデルは、テーブルの構造をJavaScriptのクラスで表現したものです。例えば、User
というテーブルを作成する場合、次のようにモデルを定義します。
javascriptconst { DataTypes } = require('sequelize');
// Userモデルの定義
const User = sequelize.define('User', {
id: {
type: DataTypes.INTEGER,
primaryKey: true,
autoIncrement: true
},
name: {
type: DataTypes.STRING,
allowNull: false
},
email: {
type: DataTypes.STRING,
allowNull: false,
unique: true
}
}, {
// オプション: テーブル名の指定
tableName: 'users',
timestamps: false // createdAt、updatedAtが不要な場合はfalse
});
ここでは、User
という名前のモデルを定義し、id
、name
、email
の3つのフィールドを持つテーブルを表しています。timestamps: false
は、createdAt
やupdatedAt
が不要な場合に設定します。
データの操作
Sequelizeを使用すると、データの作成、取得、更新、削除(CRUD操作)が簡単に行えます。
1. データの作成(Create)
javascriptasync function createUser() {
const newUser = await User.create({
name: '山田太郎',
email: '[email protected]'
});
console.log('新しいユーザーが作成されました:', newUser);
}
createUser();
User.create()
メソッドを使用して、新しいユーザーをデータベースに追加します。
2. データの取得(Read)
Sequelizeには、データを検索するためのさまざまな方法があります。findAll
メソッドを使用すると、条件に一致するすべてのレコードを取得できます。
javascriptasync function getUsers() {
const users = await User.findAll();
console.log('すべてのユーザー:', users);
}
getUsers();
特定の条件でデータを取得したい場合は、where
オプションを使用します。
javascriptasync function getUserByEmail(email) {
const user = await User.findOne({
where: { email: email }
});
console.log('メールアドレスでユーザーを検索:', user);
}
getUserByEmail('[email protected]');
3. データの更新(Update)
既存のデータを更新するには、update
メソッドを使用します。
javascriptasync function updateUser() {
const result = await User.update(
{ name: '田中太郎' }, // 更新内容
{ where: { email: '[email protected]' } } // 条件
);
console.log('更新された行数:', result[0]);
}
updateUser();
4. データの削除(Delete)
データを削除するには、destroy
メソッドを使用します。
javascriptasync function deleteUser() {
const result = await User.destroy({
where: { email: '[email protected]' }
});
console.log('削除された行数:', result);
}
deleteUser();
リレーションシップの設定
Sequelizeでは、テーブル間のリレーションシップ(1対多、多対多など)を簡単に設定できます。例えば、User
とPost
が1対多の関係にある場合、次のようにリレーションを定義します。
javascriptconst Post = sequelize.define('Post', {
title: DataTypes.STRING,
content: DataTypes.TEXT
});
// UserとPostの1対多のリレーション
User.hasMany(Post);
Post.belongsTo(User);
ここで、User.hasMany(Post)
は、1人のユーザーが複数の投稿を持つことを意味し、Post.belongsTo(User)
は、各投稿が1人のユーザーに所属することを意味します。
リレーションシップを使って、ユーザーとその投稿を一緒に取得することができます。
javascriptasync function getUserWithPosts(userId) {
const user = await User.findByPk(userId, {
include: Post // Postを一緒に取得
});
console.log('ユーザーとその投稿:', user);
}
getUserWithPosts(1);
トランザクションの使用
複数の操作を1つのトランザクションとしてまとめることができます。これにより、すべての操作が成功した場合のみデータが反映され、途中でエラーが発生した場合はロールバックされます。
javascriptconst { Op } = require('sequelize');
async function performTransaction() {
const t = await sequelize.transaction();
try {
const user = await User.create({
name: '佐藤花子',
email: '[email protected]'
}, { transaction: t });
await Post.create({
title: '新しい投稿',
content: 'これは新しい投稿の内容です。',
userId: user.id
}, { transaction: t });
await t.commit();
console.log('トランザクションが正常にコミットされました');