更改 MySQL 数据库的结构而不删除它Dockerized Node.js app with Sequelize

问题描述

我有一个与 MySQL 数据库连接的 Node.js 应用程序,它们都放置在 docker 容器上。我使用 Sequelize 包与 Node.js 中的数据库进行通信。

utils/database.js

const Sequelize = require('sequelize')

const { SQL_DB,SQL_USER,SQL_PASSWORD,SQL_HOST } = process.env
const sequelize = new Sequelize(
    SQL_DB,{
        dialect: 'mysql',host: SQL_HOST,logging: false,operatorAliases: false
    }
)

module.exports = sequelize

一切正常,只要我不更改 Node.js 中 Sequelize 模型的属性。

models/song.js

const Sequelize = require('sequelize')
const sequelize = require('../utils/database')

const User = require('./user')

const Song = sequelize.define('song',{
    id: {
        type: Sequelize.INTEGER,primaryKey: true,allowNull: false,autoIncrement: true,unique: true
    },title: {
        type: Sequelize.STRING,unique: true,},lyrics: {
        type: Sequelize.STRING,link: {
        type: Sequelize.STRING,recordedAt: {
        type: Sequelize.DATEONLY,}
})
Song.belongsTo(User,{ 
    foreignKey: {
        name:  'userId',allowNull: false
    }
})

module.exports = Song

然后我从后端收到以下错误(在这种情况下,我正在尝试向歌曲模型添加一个新字段“recordedAt”):

{
    "error": {
        "name": "SequelizeDatabaseError","parent": {
            "code": "ER_BAD_FIELD_ERROR","errno": 1054,"sqlState": "42S22","sqlMessage": "Unknown column 'recordedAt' in 'field list'","sql": "SELECT `id`,`title`,`lyrics`,`link`,`recordedAt`,`createdAt`,`updatedAt`,`userId` FROM `songs` AS `song`;"
        },"original": {
            "code": "ER_BAD_FIELD_ERROR",`userId` FROM `songs` AS `song`;"
    }
}

我知道数据库结构的变化应该作为迁移保留。我了解到在我的情况下 sequelize-cli 包会帮助我。我查看了文档 (https://sequelize.org/master/manual/migrations.html) 并在我的 Node.js 项目中成功安装了它。 但是,我有几个问题:

  1. 但是,我不明白如何在构建 docker 容器时将我当前的数据库架构替换为 config.js(开发、测试、生产)中给出的架构。

  2. 文档建议我在迁移前手动创建模型,以下命令(示例): bash npx sequelize-cli model: generate --name User --attributes firstName: string,lastName: string,email: string。 我不想手动创建模型,我希望它们从我的模型文件夹中取出,例如来自 models/song.js

  3. 在文档中,我找到了以下启动迁移的命令,虽然我决定尝试一下: bash npx sequelize-cli db: migrate。在本地运行会报错: bash ERROR: getaddrinfo EAI_AGAIN db db: 3306 在 Node.js 的容器上,我遇到了一些错误,我确定它们是由于 sequelize 和 sequelize-cli 配置的错误组合造成的。

有人可以向我解释如何实现这一点,从而允许我动态地将字段添加到数据库中,而不是每次都删除它吗?以后,这在生产环境中是不可接受的,我想好好配置一下。

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)