Nodejs ORMフレームSequelizeのクイックエントリ
Nodejs ORMフレームSequelizeのクイックエントリ
ORMとは
簡単に言うと、SQLクエリ文のパッケージは、OOPの方法でデータベースを操作して、優雅に安全でメンテナンス可能なSQLコードを生成することができます。直感的には、ModelとSQLのマッピング関係です。
SequelizeはNodejs機能に基づく強力な非同期ORMフレームです。
同時にPostgreSQL、MySQL、SQLite and MSSQLの様々なデータベースをサポートしています。Nodejsバックエンドデータベースの記憶インターフェースとして適合しています。Nodejsアプリケーションの開発のために着実で安全な基礎を築きます。
Nodejsの強みが非同期にある以上、強力な非同期をサポートするデータベースフレームを探さない理由はありません。これに合わせて、双剣が合体します。
強力なモデル定義は、仮想タイプをサポートします。Javascriptは多くの人に乱雑であると非難されていますが、関数というのは対象という特徴です。
---end---
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---