javascript - 使用sequelize(javascript ORM)来编辑,加载数据表而不删除它们(mysql)

标签 javascript mysql node.js orm sequelize.js

在 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/

相关文章:

java - 应用程序不比较 MySQL 数据库上的登录数据?

mysql - 获取列名而不是列值

node.js - 默认情况下 NodeJS 加密和二进制编码

node.js - 在 Ubuntu 上安装 Bot Framework Emulator 时出错

javascript - onclick 和 ontouchstart 同时启动

javascript - 重定向链接而不点击

javascript - 在 IE6 中伪造固定位置

javascript - 新的 Backbone 实例属性指向旧实例属性

java - JPA 删除时级联抽象/继承类

javascript - 使用 Express 的路由路径匹配 `/` 和 `/index`