问题描述
我有一个与 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 项目中成功安装了它。 但是,我有几个问题:
-
但是,我不明白如何在构建 docker 容器时将我当前的数据库架构替换为 config.js(开发、测试、生产)中给出的架构。
-
文档建议我在迁移前手动创建模型,以下命令(示例):
bash npx sequelize-cli model: generate --name User --attributes firstName: string,lastName: string,email: string
。 我不想手动创建模型,我希望它们从我的模型文件夹中取出,例如来自 models/song.js -
在文档中,我找到了以下启动迁移的命令,虽然我决定尝试一下:
bash npx sequelize-cli db: migrate
。在本地运行会报错:bash ERROR: getaddrinfo EAI_AGAIN db db: 3306
在 Node.js 的容器上,我遇到了一些错误,我确定它们是由于 sequelize 和 sequelize-cli 配置的错误组合造成的。
有人可以向我解释如何实现这一点,从而允许我动态地将字段添加到数据库中,而不是每次都删除它吗?以后,这在生产环境中是不可接受的,我想好好配置一下。
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)