zoukankan      html  css  js  c++  java
  • 【前端】nodejs的ORM框架sequelize的工厂化

    转载请注明出处: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;

    然后和上面一样进行增删改查

     

    完结,散花

  • 相关阅读:
    WINDOWS 远程桌面不能直接拷贝文件问题
    Spring的xml文件详解
    xml名称空间详解
    markdown基本语法
    web.xml文件详解
    Spring事务的7中传播行为
    docker修改容器配置文件
    Load balancer does not have available server for client: CLOUD-PROVIDER-HYSTRIX-PAYMENT
    layui导出表格的两种方法
    解决:Error:java: 无效的源发行版: 12
  • 原文地址:https://www.cnblogs.com/shamoyuu/p/sequelize_factory.html
Copyright © 2011-2022 走看看