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

Posted

技术标签:

【中文标题】在单独的文件中使用 Sequelize 创建模型并在您的项目中使用它们【英文标题】:Creating Models using Sequelize in seperate files and use them in your project 【发布时间】:2015-12-15 05:39:07 【问题描述】:

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

【问题讨论】:

【参考方案1】:

编辑

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

【讨论】:

现在不推荐使用 sequelize.import 吗?【参考方案2】:

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

你可以看看Ghost和他们的models组织,虽然他们不使用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( ... ) ) 这样的东西有助于我的工具,因为文件被解析并且不是动态依赖项。

希望这会有所帮助。

【讨论】:

感谢您的详细回答,我发现这有助于为每个模型创建单独的文件以及在我的一些模型之间创建关联以及围绕它们的使用。

以上是关于在单独的文件中使用 Sequelize 创建模型并在您的项目中使用它们的主要内容,如果未能解决你的问题,请参考以下文章

播种时运行 sequelize 模型钩子

使用sequelize时如何自动创建迁移文件?

在单独的文件夹中打破续集模型

Sequelize sync() 不会创建所有的表模型

NodeJS sequelize 自动生成模型并运行迁移 SQL 语法错误

Sequelize 模型关联不会创建新列