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()调用中,但这似乎也不对.
那么人们通常如何处理这个?
您的.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)
| 归档时间: |
|
| 查看次数: |
8308 次 |
| 最近记录: |