请就以下问题提供建议。我想使用 Sequelize 来处理现有数据库。
使用的堆栈:
- Node.js v6.10.3
- MySQL 2nd Gen 5.7 running on Google Cloud
- Sequelize 4.7.5
MySQL包含1个表 - "test_table",列"id","内容","状态"并保存一些数据。
我想定义testTable模型,它将"解释"我的MySQL"test_table"以产生续集,所以我运行:
const connection = new Sequelize("dbName", "user", "pass", {
host: xxx.xxx.xxx.xxx,
dialect: mysql
});
const testTable = connection.define('test_table', {
id: {type: Sequelize.INTEGER,
allowNull: false, unique: true,
primaryKey: true, autoIncrement:
true},
content: {type: Sequelize.STRING},
status: {type: Sequelize.STRING},
});
我得到的第一个惊喜是,从这一刻起,Node完全忽略了"test_table"的存在并创建了它的"模拟"(???)。
C:UsersdmitriDesktopapp>node query.js
Executing (default): CREATE TABLE IF NOT EXISTS `test_tables` (`id` INTEGER NOT NULL auto_increment UNIQUE , `content` VARCHAR(255), `status` INTEGER, `createdAt` DATETIME NOT NULL, `updatedAt` DAT
ETIME NOT NULL, UNIQUE `test_tables_id_unique` (`id`), PRIMARY KEY (`id`)) ENGINE=InnoDB;
Executing (default): SELECT `id`, `content`, `status`, `createdAt`, `updatedAt` FROM `test_tables` AS `test_table`;
Executing (default): SHOW INDEX FROM `test_tables`
现在MySQL包含两个表:
- 'test_table' (singular)
- 'test_tables' (plural) identical to "test_table" but empty.
我正在尝试通过执行以下 Sequelize 代码来SELECT
id,
内容FROM
test_table':
testTable
.findAll({attributes: ['id', 'content']})
.then(result=>{
console.log(result)
})
node没有返回'test_table'的内容,而是一直忽略它:
C:\Users\dmitri\Desktop\app>node query.js 正在执行(默认):选择id
,content
从test_tables
中作为test_table
;并返回 []。
它自愿跳转到查询"test_tables"而不是"test_table"的原因可能是什么?我在这里完全错过了什么吗?
非常感谢!
您应该在选项中指定表名。删除此新表,添加表名称选项并重新提升应用程序。
connection.define('test_table', {
//.... your fields
}, {
tableName: 'test_table'
});
附带说明一下,我喜欢用驼峰命名我的模型。TestTable
.connection.define('TestTable'...
也是如此
编辑: 作为您的评论,我澄清了几件事:
- 定义模型时,可以/必须指定表名。看看我的例子。指定 tableName 属性可保证复数不会让您失望。
- 你不应该做
sequelize.sync()
(除非你知道它做什么并且你想要它)。否则,您可能会遇到问题(例如续集创建另一个表,因为它找不到它要查找的表)。 - 如果要使用续集,则必须定义模型。否则它没有意义,你应该只使用 mysql2。您必须定义模型以匹配数据库中的表。