Sequelize ORM
ORMとは?
画像ソース:codestates urclass
ORMはオブジェクト関係マッピングの略で、JavaScriptのオブジェクトとリレーショナル・データベース間(オブジェクトとモデル間)の翻訳を担当します.オブジェクト向けプログラミング(OOP)では、リレーショナル・データベースとは少し異なり、プログラミング言語の観点から調整できるのがORMです.ORMでSQL文のJavaScriptコードを自動的に生成できるので、自分でSQL文を書く必要がなくデータベースにアクセスできます.
Sequelize
SequeizeはPromiseベースのノードです.js用のORMは、MySQL、MariaDB、Microsoft SQL Serverなど、さまざまなRDBMSをサポートしています.SQL文は、RDBMSごとに出力される場合が少し異なりますが、Sequelizeはそれらを調整します(互換性↑).これにより、複数のRDBMSを使用できます.
// Sequelize ORM을 사용한 예시 코드
var Sequelize = require('sequelize');
var db = new Sequelize('chatter', 'root', '');
var User = db.define('User', {
username: Sequelize.STRING
});
var Message = db.define('Message', {
userid: Sequelize.INTEGER,
text: Sequelize.STRING,
roomname: Sequelize.STRING
});
// db.define은 스키마 작성 부분.
// STRING, INTEGER 등은 RDBMS 간 다양한 field타입의 호환성을 유지시켜주기 위해 Sequelize에서 만든 데이터 타입.
// User, Message 등을 Class처럼 사용할 수 있게 해줌.
// id, CreatedAt, UpdatedAt은 자동으로 생성해줌.
User.sync()
.then(function() {
return User.create({username: 'Jean Valjean'});
}) // 데이터 생성, 해당 값은 객체로 입력. INSERT INTO ~~ VALUES구문과 동일.
.then(function() {
return User.findAll({ where: {username: 'Jean Valjean'} });
}) // 데이터 조회. SELECT * FROM ~~ WHERE구문과 동일.
.then(function(users) {
users.forEach(function(user) {
console.log(user.username + ' exists');
});
db.close();
})
.catch(function(err) {
console.error(err);
db.close();
});
ORM設定
まずSequelize CLIをインストールします.sequelize-cliは、CLIでモデルまたはアプリケーション・モードを作成できる移行を支援するツールです.
npm install --save-dev sequelize-cli
プロジェクトの初期フェーズの自動設定を支援するcliでORMを起動します.npx sequelize-cli init
正常なブートが完了すると、次のファイルとフォルダが作成されます.config/config.json // DB 연결 정보 등을 저장
models/ // DB 모델 정의를 저장
migrations/ //마이그레이션에 필요한 데이터가 자동으로 저장됨
seeders/ //테스트에 필요한 데이터를 정의
次に、以下に示すように作成したconfig/configです.jsonファイルを使用してデータベース接続を設定する必要があります.ここで注意すべき特徴は、開発、テスト、生産などの開発環境に応じて、異なるデータベースを使用できることです.{
"development": { // 개발 환경
"username": "root", // DB 사용자 이름
"password": "your_password", // DB 비밀번호
"database": "database_development", // 사용할 DB
"host": "127.0.0.1", // DB 주소
"dialect": "mysql" // DBMS
},
"test": { // 테스트 환경
"username": "root",
"password": "your_password",
"database": "database_test",
"host": "127.0.0.1",
"dialect": "mysql"
},
"production": { // 운용 환경
"username": "root",
"password": "your_password",
"database": "database_production",
"host": "127.0.0.1",
"dialect": "mysql"
}
}
開発、テスト、生産などのオブジェクトの鍵は「model/index」です.js"ファイルで環境変数(process.env.NODE ENV)を一致させるために使用します.環境変数が個別に定義されていない場合は、デフォルトは開発です.const env = process.env.NODE_ENV || 'development';
データベースがまだ作成されていない場合は、npx sequelize db:create
コマンドを実行できます.モデルの作成
「モデル」(Model)は、エンティティをオブジェクトとして表し、データ構造を記述し、データに対して実行可能なコマンドの集合である.CLIでモデルを作成できます.nameにモデルの名前を入力し、attributesにモデルに作成するフィールドを入力します.id、createdAt、updatedAtフィールドが自動的に生成されます.モデル作成エラーの場合は、作成したファイルを直接変更または削除し、コマンドを再実行できます.
npx sequelize-cli model:generate --name User --attributes firstName:string,lastName:string,email:string
上記のコマンドを実行すると、modelsフォルダにuserというモデルファイルが作成され、migrationsフォルダに「XXXXXXXXXXXXX-create-user」が作成されます.js形式の移行ファイルを生成します.Migration
移行とは、モードの変更に伴ってデータが移行することを意味します.したがって、アーキテクチャが変更されるたびに移行を実行する必要があります.
モデルを作成するまで、データはデータベースに挿入されませんでした.つまり、モデルファイルと移行ファイルのみが作成されます.次のコマンドを実行して移行すると、移行ファイルのアーキテクチャに基づいてデータベースにテーブルが作成されます.テーブル名が設定されていない場合、Sequeizeはモデル名の複数の形で自動的にテーブル名を作成します.モデル名がUserの場合、テーブル名はUsersです.
npx sequelize-cli db:migrate
最近実行した移行にリカバリする場合は、次のコマンドを実行します.npx sequelize-cli db:migrate:undo
移行ファイルのフォーマットは次のとおりです.module.exports = {
up: (queryInterface, Sequelize) => {
// logic for transforming into the new state
},
down: (queryInterface, Sequelize) => {
// logic for reverting the changes
}
}
ここで、npx sequelize-cli db:migrate
コマンドを上へ実行する場合、npx sequelize-cli db:migrate:undo
コマンドを下へ実行する場合、コードを記述して必要な値を得るだけです.Migration Skeleton
フィールドの変更のみを担当する移行ファイルを直接作成できます.次のコマンドを実行すると、移行フォルダに「xxx-migration-stokeline」と表示されます.js形式のファイルが生成されます.
npx sequelize-cli migration:generate --name migration-skeleton
渡されたqueryInterfaceオブジェクトを使用してデータベースを変更できますが、up関数とdown関数はPromiseに戻る必要があります.module.exports = {
up: (queryInterface, Sequelize) => {
return queryInterface.createTable('Person', {
name: Sequelize.DataTypes.STRING,
isBetaMember: {
type: Sequelize.DataTypes.BOOLEAN,
defaultValue: false,
allowNull: false
}
});
},
down: (queryInterface, Sequelize) => {
return queryInterface.dropTable('Person');
}
};
Association
関連付けとは、「関連付け」の意味でモデル間の関係を定義することです.Sequelizeには、HasOne、BeangStor、HasMany、BeangStorManyの4種類の関連付けがあります.
1:1関係
FooとBarの2つのモデル間で1:1の関係を確立するには、次のような操作を実行する必要があります.
Foo.hasOne(Bar);
Bar.belongsTo(Foo);
1:N関係
TeamとPlayerの2つのモデル間で1:Nの関係を確立するには、次のようにします.
Team.hasMany(Player);
Player.belongsTo(Team);
N:N関係
N:N関係は以下の通り:
const Movie = sequelize.define('Movie', { name: DataTypes.STRING });
const Actor = sequelize.define('Actor', { name: DataTypes.STRING });
Movie.belongsToMany(Actor, { through: 'ActorMovies' });
Actor.belongsToMany(Movie, { through: 'ActorMovies' });
Reference
この問題について(Sequelize ORM), 我々は、より多くの情報をここで見つけました https://velog.io/@young224/Sequelize-ORMテキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol