在 Node 应用程序中,我使用的是express和sequelize ORM
但是我注意到当我编辑模型类时,我的更新不在我的数据库中。
例如,这是名为 article.js
的文章模型:
'use strict';
const SequelizeSlugify = require('sequelize-slugify');
module.exports = function (sequelize, DataTypes) {
let Article = sequelize.define('Article', {
title: {
type: DataTypes.STRING,
unique: true,
allowNull: false
},
url: {
type: DataTypes.STRING,
unique: true,
allowNull: false
},
description: {
type: DataTypes.STRING,
unique: true,
allowNull: false
},
slug: {
type: DataTypes.STRING,
unique: true,
allowNull: false
}
}, {
classMethods: {
associate: function (models) {
// Article.hasMany(models.Comments);
}
}
});
SequelizeSlugify.slugifyModel(Article, {
source: ['title'],
overwrite: false
});
return Article;
};
如果我在此模型中添加这样的字段:
testField: {
type: DataTypes.STRING,
unique: true,
allowNull: false
}
即使我使用 cmd npm start
重新启动服务器,我的任何编辑都不会加载或注册到数据库中。
事实上,为了更新我的数据表,我必须删除它们并重新启动我的 Node 服务器。
此外,我想知道为什么 Sequelize 注册我的模型,例如这里的 article.js
作为复数名称,如我数据库中的 Articles。如何防止这种行为?
文件 article.js
位于我的文件夹 models
中,用于将模型导入到与 index.js
位于同一文件夹中的数据库中像这样的文件:
'use strict';
const fs = require('fs');
const path = require('path');
const Sequelize = require('sequelize');
const config = require(__dirname+'/database.json');
const db = {};
let sequelize = new Sequelize(config.db.dbname, config.db.user, config.db.password, {
host: config.db.host,
port: config.db.port
});
fs.readdirSync(__dirname + '/models').filter(function (file) {
return (file.indexOf('.') !== 0);
}).forEach(function (file) {
let model = sequelize['import'](path.join(__dirname + '/models', file));
db[model.name] = model;
});
Object.keys(db).forEach(function (modelName) {
if ('associate' in db[modelName]) {
db[modelName].associate(db);
}
});
db.sequelize = sequelize;
db.Sequelize = Sequelize;
module.exports = db;
最佳答案
我找到了复数表名的解决方案。事实上,我必须在 Sequelize 声明中包含模型定义。
遵循文档 here ,当我在 database.js
中声明 new Sequelize 时,我添加了一些参数,如下所示:
let sequelize = new Sequelize(config.db.dbname, config.db.user, config.db.password, {
host: config.db.host,
port: config.db.port,
define: {
// And deletedAt to be called destroyTime (remember to enable paranoid for this to work)
deletedAt: 'destroyTime',
paranoid: true,
// don't use camelcase for automatically added attributes but underscore style
underscored: true,
// disable the modification of table names; By default, sequelize will automatically
// transform all passed model names (first parameter of define) into plural.
freezeTableName: true
}
});
文件的其余部分仍然与我在最初的帖子中所写的相同。
谢谢您,祝您编码愉快。我希望这可以帮助你们中的一些人!
如果有人了解更多有关如何更新数据表而不直接从 mysql 删除数据表的信息,请随时编辑他的答案。
关于javascript - 使用sequelize(javascript ORM)来编辑,加载数据表而不删除它们(mysql),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38935774/