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

Creating Models using Sequelize in seperate files and use them in your project

我刚刚开始在我的应用程序中使用 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 文件,但很难找到如何在我的代码中使用这些模型。 谁能帮我举一个非常简单的例子(没有关系),其中包括单独文件中模型的定义及其在其他代码文件中的用法。

分隔文件中的模型是一个比例因子。基本上,如果你这样做几乎总是更好。

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

让我举例说明我是如何组织我的模型的:

我有一个 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
        }
    );

};

我在另一个文件中一个一个加载模型

现在我有另一个名为 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( ... ) ) 这样的东西有助于我的工具,因为文件被解析并且不是动态依赖项。

希望这对您有所帮助。

编辑

我已经解决了我的问题。现在我的模型在单独的文件中,我在我的代码中使用它们。这是我定义模型文件的方式 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;
});