首页 文章

在单独的文件中使用Sequelize创建模型并在项目中使用它们

提问于
浏览
2

我刚开始在我的应用程序中使用Node.js ORM Sequelize . 到目前为止,我已经在同一个文件中定义了数据库模型,并在我的控制器文件中使用它们来执行基本操作 . 这是我定义模型的方式:

var sqlize = require("sequelize");
var sq = new sqlize('test', 'root', 'root', {
host: 'localhost',
dialect: 'mysql',

pool: {
    max: 5,
    min: 0,
    idle: 10000
}
});







function services(){

var ser = sq.define('services',{

    idservices: {
        type: sqlize.INTEGER,
        autoIncrement: true,
        primaryKey: true

    },
    title:      sqlize.STRING,
    des:        sqlize.TEXT,
    vendor:     sqlize.STRING,
    rating:     sqlize.STRING,
    pricing_hr: sqlize.STRING,
    pricing_mn: sqlize.STRING,
    size:       sqlize.STRING,
    cpu:        sqlize.STRING,
    ram:        sqlize.STRING,
    os:         sqlize.STRING,
    img_path:   sqlize.STRING
});

sq.sync();



return ser;

}



function category(){

var category = sq.define('category',{
    id: {
        type: sqlize.INTEGER,
        autoIncrement: true,
        primaryKey: true

    },
    category: sqlize.STRING,
    sid: sqlize.INTEGER

},{

    freezeTableName: true,
    timestamps: false
});

sq.sync();



return category;

}


function cat(){

var cat = sq.define('cat',{
    idcat: {
        type: sqlize.INTEGER,
        autoIncrement: true,
        primaryKey: true

    },
    cat: sqlize.STRING

},{

    freezeTableName: true,
    timestamps: false
});

sq.sync();



return cat;

}



exports.services=services;
exports.category=category;
exports.cat=cat;

但是,还有另一种方法可以在单独的文件中定义模型,并创建一个加载模型的索引文件 . 我发现Sequelize的官方文档对我来说还不够用 . 我知道如何创建模型和index.js文件但是如何在我的代码中使用这些模型很难找到 . 任何人都可以帮我一个非常简单的例子(没有关系),包括单独文件中模型的定义及其在其他代码文件中的使用 .

2 回答

  • 1

    编辑

    我've fixed my problem. Now my models are in seperate files and I'm在我的代码中使用它们 . 这里's how I' ve定义了我的模型文件 services.js

    module.exports = function(sequelize, DataTypes) {
    
    return sequelize.define('services',{
    
        idservices: {
            type: DataTypes.INTEGER,
            autoIncrement: true,
            primaryKey: true
    
        },
        title:      DataTypes.STRING,
        des:        DataTypes.TEXT,
        vendor:     DataTypes.STRING,
        rating:     DataTypes.STRING,
        pricing_hr: DataTypes.STRING,
        pricing_mn: DataTypes.STRING,
        size:       DataTypes.STRING,
        cpu:        DataTypes.STRING,
        ram:        DataTypes.STRING,
        os:         DataTypes.STRING,
        img_path:   DataTypes.STRING
    });
    
    
    };
    

    然后在 index.js 中使用sequelize.import我导入了所有模型:

    var Sequelize = require('sequelize');
    
    
    // initialize database connection
    var sequelize = new Sequelize('test', 'root', 'root', {
    host: 'localhost',
    dialect: 'mysql',
    
    pool: {
        max: 5,
        min: 0,
        idle: 10000
    }
    });
    
    // load models
    var models = [
    'services',
    'serviceCategory',
    'category'
    ];
    models.forEach(function(model) {
    module.exports[model] = sequelize.import(__dirname + '/' + model);
    });
    
    
    
    // export connection
    module.exports.sequelize = sequelize;
    

    现在,我可以在项目的任何文件中使用这些模型,方法是 index.js ,如下所示:

    //*********************************************
    //Sequlize models to handle database commands;
    var models  =  require('../models/index.js');
    var s       =  models.services;             //Services table handler
    var sc      =  models.serviceCategory;      //Service Category table handler
    var ca      =  models.category;             //Category table handler
    

    现在,如果要使用服务模型选项,则可以使用服务模型对象:

    s.create({title: "anything"}).then(function(task){
    
        task.save;
    });
    
  • 3

    在文件中分离模型是一个缩放因子 . 基本上,如果你这样做,几乎总是更好 .

    你可以看看Ghost和他们的模型组织,虽然他们不使用sequelize,但是另一个ORM,叫做bookshelf .

    让我举个例子来说明我如何组织我的模型:

    I have one models/ folder which contains all models

    models/user.js
    models/assignment.js
    

    每个模型只导出一个 initialize function ,用户模型如下所示:

    /**
     * Initialize User definition
     *
     * @param sequelize Sequelize Instance
     * @returns {UserClass} Returns the Users model
     */
    module.exports = function( sequelize ) {
    
        /** Create the schema */
        var Model = sequelize.define(
            'user',
            schemaAttributes,
            {
                instanceMethods : instanceMethods,
                classMethods    : classMethods
            }
        );
    
        /** Adding hooks */
        Model.beforeCreate( storePassword );
        Model.beforeUpdate( storePassword );
    
        return Model;
    
    };
    

    对于 assignment.js 看起来几乎相同,但没有钩子:

    /**
     * Initialize Assignment definition
     *
     * @param sequelize Sequelize Instance
     * @returns {AssignmentClass} Returns the Assignment model
     */
    module.exports = function( sequelize ) {
    
        /** Create the schema */
        return sequelize.define(
            'assignment',
            schemaAttributes,
            {
                instanceMethods : instanceMethods,
                classMethods    : classMethods
            }
        );
    
    };
    

    I load the models one by one in another file

    现在我有另一个名为 database.js 的模块来管理我的模型的配置 . 它看起来像这样:

    var user        = require('./models/user.js');
    var assignment  = require('./models/assignment.js');
    var sequelize   = new Sequelize({...});
    
    var dbUser = user( sequelize );
    var dbAssignment = assignment( sequelize );
    
    /** Define relationships */
    dbUser.hasManu( dbAssignment );
    
    module.exports = {
        user : dbUser,
        assignment : dbAssignment
    };
    

    使用这个而不是像 require( fs.readDirSync( ... ) ) 这样的东西有助于我的工具,因为文件被解析而不是动态依赖 .

    希望这可以帮助 .

相关问题