我对在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()调用中,但这似乎也不正确。
那么人们通常如何处理这个?
答案 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){});