【前端】nodejs的ORM框架sequelize的工厂化
转载请注明出处:http://www.cnblogs.com/shamoyuu/p/sequelize_factory.html
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;
然后和上面一样进行增删改查
完结,散花