转载请注明出处:http://www.cnblogs.com/shamoyuu/p/sequelize_factory.html
一、什么是sequelize
nodejs的后台在操作数据库的时候,需要程序员写sql,但是面向集合的sql语言对我们面向对象的程序员很不友好,所以Java有hibernate,js有sequelize。hibernate和sequelize都是面向对象的,用它们操作数据库既方便快捷,又安全可靠。
官方API http://www.nodeclass.com/api/sequelize.html 下面用到的sequelize所有属性和方法的具体详情都可以到此查看
二、sequelize的用法
首先安装
cnpm install --save sequelize
cnpm install --save mysql
cnpm install --save mysql2
mysql2,最新版本的sequelize需要用到,具体干啥的还没研究
安装完然后写代码,首先引入
var Sequelize = require('sequelize');
然后连接数据库
var sequelize = new Sequelize(
'database', //数据库名
'root', //用户名
'123456', //密码
{
'dialect': 'mysql', // 数据库使用mysql
'host': 'localhost', // 数据库服务器ip
'port': 3306 // 数据库服务器端口
}
);
然后新建一个表对象,用来操作数据库表
var User = sequelize.define('User', {
user_name: {
type: DataTypes.STRING,
allowNull: false
},
user_level: {
type: DataTypes.INTEGER,
allowNull: false
},
user_proj: {
type: DataTypes.STRING
}
});
插入一条数据
User.create({
user_name: 'Meleong',
user_level: 1
})
删除一条数据
User.destroy({
where: {
id: 1
}
})
修改一条数据
User.update({
password: '12'
},
{
where: {
name: {
$like: 'Xiao%'
}
}
})
查找数据
User.findAll({
attributes: ['user_name', 'user_level'],
where: {
id: {
$eq: '1'
}
}
}).then(function (result) {
console.info("获取到的用户信息", result)
});
看上去是挺美好的,但是如果表多了,对象也多了,就不好维护,总不能每个js里初始化一遍吧,所以我们需要一个工厂,来为我们生产表对象
二、sequelize的小工厂
首先我们新建一个文件config/dbconfig.json,用来存储数据库的配置
{
"development": {
"username": "development-username",
"password": "development-password",
"database": "development-database",
"options": {
"host": "localhost",
"dialect": "mysql",
"port": 3360
}
},
"production": {
"username": "production-username",
"password": "production-password",
"database": "production-database",
"options": {
"host": "sqld.duapp.com",
"dialect": "mysql",
"port": 4050
}
}
}
然后我们新建一个文件夹models,它用来存储所有的表对象
然后我们在这个文件夹下新建一个index.model.js文件
var fs = require('fs');
var path = require('path');
var Sequelize = require('sequelize');
var basename = path.basename(module.filename);
var env = process.env.NODE_ENV || 'development';
var config = require(__dirname + '/../config/dbconfig.json')[env];
var db = {};
var sequelize = new Sequelize(config.database, config.username, config.password, config.options);
//扫描当前路径(models)下所有的js文件,然后通过sequelize.import的方法导入
fs
.readdirSync(__dirname)
.filter(function (file) {
return (file !== basename) && (file.slice(-8) === 'model.js');
})
.forEach(function (file) {
console.info(file);
var model = sequelize.import(path.join(__dirname, file));
db[model.name] = model;
});
Object.keys(db).forEach(function (modelName) {
if (db[modelName].associate) {
db[modelName].associate(db);
}
});
//自动建表
// sequelize.sync().then(function () {
// console.info("建表完成")
// }, function () {
// console.info("建表失败", arguments);
// });
db.sequelize = sequelize;
db.Sequelize = Sequelize;
module.exports = db;
这里是用了sequelize.import方法,通过文件的形式导入表对象。
最下面注释掉的代码是自动建表,如果表不存在就会自动根据表对象的内容创建表,它的具体参数可以看官方API
然后我们在models文件夹下新建文件user.model.js
module.exports = function (sequelize, DataTypes) {
var User = sequelize.define('User', {
id: {
type: DataTypes.INTEGER,
allowNull: false,
primaryKey: true,
unique: true,
autoIncrement: true
},
name: DataTypes.STRING(255),
age: DataTypes.INTEGER(11)
}, {
timestamps: false,
tableName: 'user'
});
return User;
};
至此我们整个表对象的工厂已经完成了,如果你仔细观察会发现index.model.js文件里并没有任何User字符,因为User表对象不需要我们手动导入,index.model.js会自动扫描models文件夹下所有的文件,并且导入后缀为model.js的文件
然后我们在需要的地方引入index.model文件,就可以直接获取表对象
var User = require('../models/index').User;
然后和上面一样进行增删改查
完结,散花