開発運用

Sequelizeでのデータベース操作

Sequelizeは、Node.js用の強力なORM(Object Relational Mapper)であり、リレーショナルデータベース(RDBMS)との連携を簡単に行うことができます。Sequelizeを使用すると、SQLの知識がなくても、JavaScriptのオブジェクト指向プログラミングを用いてデータベース操作を行うことができます。この完全かつ包括的な記事では、Sequelizeを使用してリレーショナルデータベースを操作する方法を詳しく解説します。

Sequelizeの基本概念とインストール方法

Sequelizeは、MySQL、PostgreSQL、SQLite、MariaDB、Microsoft SQL Serverなど、さまざまなリレーショナルデータベースに対応しています。まず、Sequelizeをプロジェクトにインストールする必要があります。

インストール

Sequelizeをインストールするには、以下のコマンドを使用します:

bash
npm install sequelize

さらに、データベースドライバ(例えば、MySQLの場合)は別途インストールする必要があります。MySQLの例を挙げると、次のようにインストールします。

bash
npm install mysql2

これで、SequelizeとMySQLのセットアップが完了しました。

データベース接続の設定

次に、Sequelizeを使用してデータベースに接続します。接続設定を行うためには、new Sequelize()を使用します。接続先のデータベース、ユーザー名、パスワードを指定する必要があります。

javascript
const { 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というテーブルを作成する場合、次のようにモデルを定義します。

javascript
const { 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という名前のモデルを定義し、idnameemailの3つのフィールドを持つテーブルを表しています。timestamps: falseは、createdAtupdatedAtが不要な場合に設定します。

データの操作

Sequelizeを使用すると、データの作成、取得、更新、削除(CRUD操作)が簡単に行えます。

1. データの作成(Create)

javascript
async function createUser() { const newUser = await User.create({ name: '山田太郎', email: '[email protected]' }); console.log('新しいユーザーが作成されました:', newUser); } createUser();

User.create()メソッドを使用して、新しいユーザーをデータベースに追加します。

2. データの取得(Read)

Sequelizeには、データを検索するためのさまざまな方法があります。findAllメソッドを使用すると、条件に一致するすべてのレコードを取得できます。

javascript
async function getUsers() { const users = await User.findAll(); console.log('すべてのユーザー:', users); } getUsers();

特定の条件でデータを取得したい場合は、whereオプションを使用します。

javascript
async function getUserByEmail(email) { const user = await User.findOne({ where: { email: email } }); console.log('メールアドレスでユーザーを検索:', user); } getUserByEmail('[email protected]');

3. データの更新(Update)

既存のデータを更新するには、updateメソッドを使用します。

javascript
async function updateUser() { const result = await User.update( { name: '田中太郎' }, // 更新内容 { where: { email: '[email protected]' } } // 条件 ); console.log('更新された行数:', result[0]); } updateUser();

4. データの削除(Delete)

データを削除するには、destroyメソッドを使用します。

javascript
async function deleteUser() { const result = await User.destroy({ where: { email: '[email protected]' } }); console.log('削除された行数:', result); } deleteUser();

リレーションシップの設定

Sequelizeでは、テーブル間のリレーションシップ(1対多、多対多など)を簡単に設定できます。例えば、UserPostが1対多の関係にある場合、次のようにリレーションを定義します。

javascript
const 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人のユーザーに所属することを意味します。

リレーションシップを使って、ユーザーとその投稿を一緒に取得することができます。

javascript
async function getUserWithPosts(userId) { const user = await User.findByPk(userId, { include: Post // Postを一緒に取得 }); console.log('ユーザーとその投稿:', user); } getUserWithPosts(1);

トランザクションの使用

複数の操作を1つのトランザクションとしてまとめることができます。これにより、すべての操作が成功した場合のみデータが反映され、途中でエラーが発生した場合はロールバックされます。

javascript
const { 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('トランザクションが正常にコミットされました');

Back to top button