Nodejs ORMフレームSequelizeのクイックエントリ


Nodejs ORMフレームSequelizeのクイックエントリ
ORMとは
簡単に言うと、SQLクエリ文のパッケージは、OOPの方法でデータベースを操作して、優雅に安全でメンテナンス可能なSQLコードを生成することができます。直感的には、ModelとSQLのマッピング関係です。
const User = sequelize.define('user', {
    id: {
        type: Sequelize.INTEGER,
        allowNull: false,
        autoIncrement: true,
        primaryKey: true
    },
    email: {
        type: Sequelize.STRING,
        allowNull: false,
        validate: {
            isEmail: true
        },
        unique: true
    }
})
CREATE TABLE IF NOT EXISTS `users` (
  `id` INTEGER PRIMARY KEY AUTOINCREMENT,
  `email` VARCHAR(255) NOT NULL UNIQUE
  `createdAt` DATETIME NOT NULL,
  `updatedAt` DATETIME NOT NULL,
  UNIQUE (email)
);
では、Sequelizeとは何ですか?
SequelizeはNodejs機能に基づく強力な非同期ORMフレームです。
同時にPostgreSQL、MySQL、SQLite and MSSQLの様々なデータベースをサポートしています。Nodejsバックエンドデータベースの記憶インターフェースとして適合しています。Nodejsアプリケーションの開発のために着実で安全な基礎を築きます。
Nodejsの強みが非同期にある以上、強力な非同期をサポートするデータベースフレームを探さない理由はありません。これに合わせて、双剣が合体します。
//    
var Sequelize = require('sequelize');
//     (     )
var sequelize = new Sequelize('database', 'username', 'password',  {
  host: 'localhost',
  dialect: 'mysql'|'sqlite'|'postgres'|'mssql',
  pool: {
    max: 5,
    min: 0,
    idle: 10000
  },
  // SQLite only
  storage: 'path/to/database.sqlite'
});
//      
var User = sequelize.define('user', {
  username: Sequelize.STRING,
  birthday: Sequelize.DATE
});
//     
sequelize.sync().then(function() {
  return User.create({
    username: 'janedoe',
    birthday: new Date(1980, 6, 20)
  });
}).then(function(jane) {
  //    
  console.log(jane.get({
    plain: true
  }));
}).catch(function (err) {
  //    
  console.log('Unable to connect to the database:', err);
});
Sequelizeはどんな特色がありますか?
強力なモデル定義は、仮想タイプをサポートします。Javascriptは多くの人に乱雑であると非難されていますが、関数というのは対象という特徴です。
var Foo = sequelize.define('foo', {
  firstname: Sequelize.STRING,
  lastname: Sequelize.STRING
}, {
  getterMethods   : {
    fullName       : function()  { return this.firstname + ' ' + this.lastname }
  },
  setterMethods   : {
    fullName       : function(value) {
        var names = value.split(' ');
        this.setDataValue('firstname', names.slice(0, -1).join(' '));
        this.setDataValue('lastname', names.slice(-1).join(' '));
    },
  }
});
完璧なデータ検証をサポートし、前後の検証圧力を軽減します。
var ValidateMe = sequelize.define('foo', {
  foo: {
    type: Sequelize.STRING,
    validate: {
      is: ["^[a-z]+$",'i'],     //      
      is: /^[a-z]+$/i,          //      ,        
      not: ["[a-z]",'i'],       //       
      isEmail: true,            //       
      isUrl: true,              //        
      isIP: true,               //      IP  
      isIPv4: true,             //      IPv4  
      isIPv6: true,             //      IPv6  
      isAlpha: true,            //      
      isAlphanumeric: true,     //         
      isNumeric: true,          //      
      isInt: true,              //      
      isFloat: true,            //       
      isDecimal: true,          //        
      isLowercase: true,        //      
      isUppercase: true,        //     
      notNull: true,            //     null
      isNull: true,             //    null
      notEmpty: true,           //      
      equals: 'specific value', //      
      contains: 'foo',          //       
      notIn: [['foo', 'bar']],  //      
      isIn: [['foo', 'bar']],   //     
      notContains: 'bar',       //    
      len: [2,10],              //     
      isUUID: 4,                //       uuids
      isDate: true,             //        
      isAfter: "2011-11-05",    //         
      isBefore: "2011-11-05",   //         
      max: 23,                  //    
      min: 23,                  //    
      isArray: true,            //      
      isCreditCard: true,       //          
      //      
      isEven: function(value) {
        if(parseInt(value) % 2 != 0) {
          throw new Error('     !')
        }
      }
    }
  }
});
Sequelizeのクエリは非常に包括的で柔軟です。
Project.findAll({
  //    ,   
  where: {
    id: {
      $and: {a: 5}           // AND (a = 5)
      $or: [{a: 5}, {a: 6}]  // (a = 5 OR a = 6)
      $gt: 6,                // id > 6
      $gte: 6,               // id >= 6
      $lt: 10,               // id < 10
      $lte: 10,              // id <= 10
      $ne: 20,               // id != 20
      $between: [6, 10],     // BETWEEN 6 AND 10
      $notBetween: [11, 15], // NOT BETWEEN 11 AND 15
      $in: [1, 2],           // IN [1, 2]
      $notIn: [1, 2],        // NOT IN [1, 2]
      $like: '%hat',         // LIKE '%hat'
      $notLike: '%hat'       // NOT LIKE '%hat'
      $iLike: '%hat'         // ILIKE '%hat' (case insensitive)  (PG only)
      $notILike: '%hat'      // NOT ILIKE '%hat'  (PG only)
      $overlap: [1, 2]       // && [1, 2] (PG array overlap operator)
      $contains: [1, 2]      // @> [1, 2] (PG array contains operator)
      $contained: [1, 2]     // 
var User = sequelize.define('user', { name: Sequelize.STRING })
  , Task = sequelize.define('task', { name: Sequelize.STRING })
  , Tool = sequelize.define('tool', { name: Sequelize.STRING })
Task.belongsTo(User) //        UserId   Task
User.hasMany(Task) //   Task        userId
User.hasMany(Tool, { as: 'Instruments' }) //   Task           InstrumentsId
Task.findAll({ include: [ User ] })
User.findAll({ include: [{
    model: Tool,
    as: 'Instruments',
    where: { name: { $like: '%ooth%' } }
}] })
User.findAll({ include: ['Instruments'] })
var User = this.sequelize.define('user', {/* attributes */}, {underscored: true})
  , Company  = this.sequelize.define('company', {
    uuid: {
      type: Sequelize.UUID,
      primaryKey: true
    }
  });
User.belongsTo(Company); //    company_uuid       user
User.belongsTo(UserRole, {as: 'role'});
//         roleId   user     userRoleId
User.belongsTo(Company, {foreignKey: 'fk_companyname', targetKey: 'name'}); //           fk_companyname   User
Person.hasOne(Person, {as: 'Father', foreignKey: 'DadId'})
// Person        DadId
Coach.hasOne(Team)  // `coachId`    Team      
Project.hasMany(User, {as: 'Workers'})
//   User        projectId / project_id
Project.belongsToMany(User, {through: 'UserProject'});
User.belongsToMany(Project, {through: 'UserProject'});
//       : UserProject       :projectId   userId
Sequelizeには、完全な移動同期データスキーム、migrate so easuryがあります。
//$ sequelize db:migrate //           ,       js
module.exports = {
  up: function(queryInterface, Sequelize) {
    //           
  },
  down: function(queryInterface, Sequelize) {
    //        
  }
}
回転: http://hopperclouds.github.io/2016/09/12/Nodejs-ORM%E6%A1%86%E6%9E%B6Sequelizejs%E5%BF%AB%E9%80%9F%E5%85%A5%E9%97%A8/
---end---