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

myk*_*ark 8 sqlite node.js 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"
});
Run Code Online (Sandbox Code Playgroud)

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

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

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

Val*_*Val 7

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

因此,对于您的情况,您将拥有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) {}                                              

       }                                                                                            
     });                                                                                              
   };
Run Code Online (Sandbox Code Playgroud)

models/index.js - > 见这里

编辑 03/14/17

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

npm install sequelize-cli
Run Code Online (Sandbox Code Playgroud)

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

然后初始化sequelize迁移:

sequelize init
Run Code Online (Sandbox Code Playgroud)

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

config:
   -config.json
models:
   -index.js
seeders:
migrations:
Run Code Online (Sandbox Code Playgroud)

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

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

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

 config:
   -config.json
models:
   -index.js
   -user.js
   -page.js
seeders:
migrations:
Run Code Online (Sandbox Code Playgroud)

然后,您需要进入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;
Run Code Online (Sandbox Code Playgroud)

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

postgresInit.sh

[...]
`sudo -u postgres createdb -U postgres -O $PG_USER $PG_DB. `
Run Code Online (Sandbox Code Playgroud)

如果您更喜欢javascript解决方案,那么这里有一个SO解决方案

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){});
Run Code Online (Sandbox Code Playgroud)

  • 链接已经死了 (4认同)