如何处理首先调用sequelize.sync()?

时间:2014-06-26 00:41:58

标签: node.js sqlite sequelize.js

我对在nodejs中开发有点新意,所以这可能是一个简单的问题。我正在构建一个基于express + sequelize的典型webapp。我在内存中使用sqlite,因为我现在只是原型设计。我理解如果我使用持久的sqlite文件,这可能不是问题,但这不是我目前的目标。请考虑以下事项:

var User = sequelize.define("User", {
    "username": DataTypes.STRING,
    // etc, etc, etc
});

sequelize.sync();

User.build({
    "username": "mykospark"
});

首先,我在User.build()上收到有关Users表尚未存在的错误。我意识到sequelize.sync()被称为异步,插入是在创建表之前发生的。然后我重新安排了我的代码,以便User.build()调用在sequelize.sync()。complete()内部,它修复了问题,但我不知道如何将其应用于我的项目的其余部分。

我的项目在很多不同的地方使用模型。我的理解是,我只想在定义模型后调用sequelize.sync(),然后可以自由使用它们。我可能会找到一些方法来阻止整个nodejs应用程序,直到sequelize.sync()完成,但这似乎不是一个好的形式。我想我可以将每个模型操作包装到sequelize.sync()。complete()调用中,但这似乎也不正确。

那么人们通常如何处理这个?

1 个答案:

答案 0 :(得分:6)

您的.sync()调用应在app.js文件中调用一次。但是,如果在一个服务器中管理多个数据库,则可能还有其他调用。通常,您的.sync()调用将位于您的服务器文件中,而var User = sequelize.define("ModelName"...将位于您的models / modelName.js文件中。 Sequelize建议这种类型的指导,以创建一个可维护的应用程序,其中数据库逻辑被收集在模型文件夹"中。这将有助于您的发展。在答案的后面,我将提供一个简单的步骤来初始化文件结构。

因此,对于您的情况,您将拥有app.js,models / index.js和models / users.js。 app.js将是运行.sync()方法的服务器。在models文件夹中,您将拥有所需的index.js文件夹,您可以在其中配置与数据库的连接并收集所有模型定义。最后,您有了user.js文件,您可以使用类和实例方法添加模型。下面是您可能会发现有用的models / user.js文件的示例。

<强> user.js的

    module.exports = function(sequelize, DataTypes) {                                                    
    return sequelize.define('User', {                                                             
        username: DataTypes.STRING,                                                                  
    },{                                                                                              
        classMethods: {                                                                              
            doSomething: function(successcb, errcb, request) {}                                             
       },                                                                                           
       instanceMethods: {                                                                           
           someThingElse: function(successcb, errcb, request) {}                                              

       }                                                                                            
     });                                                                                              
   };

models / index.js - &gt; See here

编辑 03/14/17

现在,使用sequelize设置节点应用程序的最佳选择是使用sequelize-cli。这是续集迁移,在开发和生产环境中具有非常有用的功能。对于此问题的范围和对答案的修订,最佳方法如下:

npm install sequelize-cli

如果要全局安装,请使用npm install sequelize-cli -g

然后初始化续集迁移:

sequelize init

它应该在您启动命令的文件夹中安装以下文件夹和文件结构:

config:
   -config.json
models:
   -index.js
seeders:
migrations:

如果要创建模型,可以运行以下命令,它将自动为您生成文件结构。这是一个例子

sequelize model:create --name User --attributes "user:string email:string"

接下来,您应该能够在models / page.js中看到新模型page

 config:
   -config.json
models:
   -index.js
   -user.js
   -page.js
seeders:
migrations:

然后您需要进入models / index.js并为您的数据库定义新模型以访问该模型的正确路径。这是一个例子:

<强>模型/ index.js

var sq = new Sequelize(dbname, user, password, config);

db = {
    Sequelize: Sequelize,
    sequelize: sq,
    page: sq.import(__dirname + '/page.js'),
    user: sq.import(__dirname + '/user.js')
}
module.exports = db;

如果您需要对模型进行更改,可以进入迁移文件夹并添加方法。按照续集迁移文档here进行操作。现在,关于app.js服务器。在运行服务器之前,您需要初始化数据库。在运行服务器以设置postgres db之前,我使用以下脚本初始化数据库:

<强> postgresInit.sh

[...]
`sudo -u postgres createdb -U postgres -O $PG_USER $PG_DB. `

如果你更喜欢javascript解决方案,那就有一个SO解决方案here

<强> app.js

[...]
console.log('this will sync your table to your database')
console.log('and the console should read out Executing (default): CREATE TABLE IF NOT EXISTS "TABLE NAME"....')
db.sequelize.sync(function(err){});