【问题标题】:sequelize.sync({force:true}) not working and the logging of method is emptysequelize.sync({force:true}) 不起作用并且方法的日志记录为空
【发布时间】:2020-09-10 02:38:53
【问题描述】:

我在写这个问题时看到了很多问题。他们都没有遇到同样的问题,在连续 20 小时试图解决这个问题后,我压力很大,如果我没有看到类似的问题,很抱歉。好的,问题如下:我正在使用nodejs,expressjs(4.17),sequelize-cli(6.2.0)和sequelizejs(6.3.5)来做一个服务器并与mysql(mysql2 2.1.0)通信并为出于某种原因,当我使用函数sequelize.sync()(有或没有{force:true})时,它只是不更新​​已经创建的数据库中的表,它什么都不做,没有错误,没有警告,只是不做应该做的。 我使用npx sequelize model:generate --name ... --attributes ... 创建了模型,因此创建的迁移没有我手动插入的任何内容,因为我搜索了不应该更改迁移文件的内容。然后我运行npx sequelize db:migrate 以向上迁移到数据库,最后对未同步的模型进行了一些更改。

这是 server.js 代码:

const http = require('http')
const Sequelize = require('sequelize')
const app = require('./src/app')
const port = process.env.PORT || 3000
const server = http.createServer(app)

const contatos = require('./src/_db/models/contatos')
const corretores = require('./src/_db/models/corretores')
const imoveis = require('./src/_db/models/imoveis')
const tipoimovel = require('./src/_db/models/tipoimovel')

const sequelize = new Sequelize(process.env.DB_NAME, process.env.DB_USERNAME, process.env.DB_PASSWORD, {
    host: 'localhost',
    dialect: "mysql" /* one of 'mysql' | 'mariadb' | 'postgres' | 'mssql' */,
    logging: console.log,  
})

sequelize.authenticate().then( () => {
    console.log('Connection has been established successfully.');
    

    sequelize.sync({logging:console.log, force:true})
        .then(() => {
            // console.log(`Database & tables created!`);
            return server.listen(port)
        }).catch((error)=>{
            return console.error(error);
        });

}).catch((error) => {
    console.error('Unable to connect to the database:', error);
})

我的 app.js 的代码:

const express = require('express')
const bodyParser = require('body-parser')
const morgan = require('morgan')
const Sequelize = require('sequelize')
const app = express()

app.use(morgan('dev'))
app.use(bodyParser.urlencoded({ extended: false }))
app.use(bodyParser.json())

app.use((req, res, next) => {
    res.header('Access-Control-Allow-Origin', '*')
    res.header(
        'Access-Control-Allow-Headers',
        'Origin, X-Requested-With, Accept, Authorization'
    )
    if (req.method === 'OPTIONS') {
        res.header('Access-Control-Allow-Methods', 'PUT, POST, PATCH, DELETE, GET')
        return res.status(200).json({})
    }
    next()
})



app.use((req, res, next) => {
    const error = new Error('Not found')
    error.status = 404
    next(error)
})

app.use((error, req, res, next) => {
    res.status(error.status || 500)
    res.json({
        error: {
            message: error.message
        }
    })
})

module.exports = app

所有控制台结果:

[nodemon] restarting due to changes...  
[nodemon] starting 'node server.js'    
Executing (default): SELECT 1+1 AS result     
Connection has been established successfully.     
Executing (default): SELECT 1+1 AS result     
Database & tables created! 

最后是我尝试更新数据库的模型示例,我已经做出了更改:

'use strict';
const {
  Model
} = require('sequelize');
module.exports = (sequelize, DataTypes) => {
  class tipoImovel extends Model {
    
    static associate(models) {
      // define association here
      this.hasOne(models.Imoveis)
    }
  };
  tipoImovel.init({
    tipoNome: {type:DataTypes.STRING,allowNull:false},
    tipoSigla: {type: DataTypes.STRING(2),allowNull:false,unique:true}
  }, {
    sequelize,
    modelName: 'tipoImovel',
  });
  return tipoImovel;
};

【问题讨论】:

    标签: javascript mysql node.js express sequelize.js


    【解决方案1】:

    我用过这样的同步,我为我工作,如果你愿意,你可以尝试它作为解决方案

    'use strict';
    const Sequelize = require('sequelize');
    const cls = require('cls-hooked');
    const namespace = cls.createNamespace('my-very-own-namespace');
    Sequelize.useCLS(namespace);
    const config = require("../environments/index");
    
    // server connection settings
    var db_instance = new Sequelize(config.DB.database, config.DB.username, config.DB.password, {
      host: config.DB.host,
      dialect: config.DB.dialect,
      define: {
        timestamps: false
      },
      logging: false
    });
    
    var sequelize = db_instance;
    
    // checks the database connectivity
    sequelize
      .authenticate()
      .then(() => {
        console.log('Connection has been established successfully.');
      })
      .catch(err => {
        console.error('Unable to connect to the database:', err);
      });
    
    
    const db = {};
    
    db.sequelize = sequelize;
    db.Sequelize = Sequelize;
    
    // create the modal instance 
    db.users = require('../model/users.model')(sequelize, Sequelize);
    db.country = require('../model/country.model')(sequelize, Sequelize);
    db.state = require('../model/state.model')(sequelize, Sequelize);
    db.city = require('../model/city.model')(sequelize, Sequelize);
    db.verify_otp = require('../model/verify_otp.model')(sequelize, Sequelize);
    db.organizations = require('../model/organizations.model')(sequelize, Sequelize);
    db.features = require('../model/features.model')(sequelize, Sequelize);
    db.user_features = require('../model/user_features.model')(sequelize, Sequelize);
    db.roles = require('../model/roles.model')(sequelize, Sequelize);
    db.user_roles = require('../model/user_roles.model')(sequelize, Sequelize);
    
    
    
    db.sequelize.sync({ force: true }).then(() => {
      console.log("Drop and re-sync db.");
    });
    
    module.exports = db;

    【讨论】:

    • 您好,感谢您的帮助,但这是我在使用{force:true} 之前尝试过的,在我将sequelize.sync() 移动到身份验证中之前,它绝对没有效果或改变,我想是问题所在与我如何导入库或如何安装它们有关。因为它发生在我的两个 API 项目中。我使用 Koa 而不是 Express 的另一个项目,idk 如果这有事要做。
    • 我已经更新了答案你也可以试试
    • 哎呀,我试试。我正在努力导入模型哈哈。
    • 如果答案对您的问题有帮助,如果您能将其标记为已接受的答案,我将不胜感激
    • ok... 新闻... 这一次我没有错过代码的关键部分,它成功了!将您的答案标记为已接受!哈哈,我只是想解释一下那里的模型导入行,通过sequelize和Sequelize,谢谢!
    猜你喜欢
    • 2021-11-19
    • 1970-01-01
    • 2018-08-24
    • 2011-12-27
    • 2013-04-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多