mysql - 为现有 MySQL 数据库定义 Sequelize 模型

标签 mysql node.js sequelize.js

请就以下问题提出建议。我想使用 Sequelize 来处理现有数据库。

使用的堆栈:

- Node.js v6.10.3
- MySQL 2nd Gen 5.7 running on Google Cloud
- Sequelize 4.7.5

MySQL 包含 1 个表 - “test_table”,列为“id”、“content”、“status”并保存一些数据。

我想定义 testTable 模型,它会为 sequelize “解释”我的 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:\Users\dmitri\Desktop\app>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 代码来SELECTid,contentFROMtest_table`:

testTable
    .findAll({attributes: ['id', 'content']})
    .then(result=>{
           console.log(result)
         })

Node 没有返回“test_table”的内容,而是一直忽略它:

C:\Users\dmitri\Desktop\app>node query.js 执行(默认):SELECT id, content FROM test_tables AS test_table;

并返回 []。

它主动跳转到查询'test_tables'而不是'test_table'的原因可能是什么?我在这里完全错过了什么吗?

非常感谢!

最佳答案

您应该在选项中指定表名。删除这个新表,添加表名选项并重新提升应用程序。

connection.define('test_table', {
  //.... your fields
}, {
  tableName: 'test_table'
});

附带说明一下,我喜欢用驼峰命名我的模型。 测试表connection.define('TestTable'...

也是如此

编辑: 作为您的意见,我澄清了几件事:

  • 您可以/必须在定义模型时指定表名。看我的例子。指定 tableName 属性可确保复数化不会让您失望。
  • 您不应该执行 sequelize.sync()(除非您知道它的作用并且您想要它)。否则你可能会遇到问题(比如 sequelize 创建另一个表,因为它找不到它要找的表)。
  • 如果您想使用 sequelize,则必须定义模型。否则它没有意义,你应该只使用 mysql2。您必须定义模型以匹配数据库中的表。

关于mysql - 为现有 MySQL 数据库定义 Sequelize 模型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45982144/

相关文章:

mysql - 根据表的值组合获取记录

php - 部分代码被跳过

node.js - 如何向客户端发送 Facebook 登录后创建的 JSON Web Token?

javascript - NodeJS 护照 Facebook OAuth

javascript - 使用 Sequelize 如何指定要排序/限制的字段?

mysql - 如何在FROM子句中更新目标表?

mysql - 我可以使用只有 1.7GB RAM 的 Amazon EC2 "Small"实例运行 MySQL 集群吗?

javascript - 如何访问 req.body 的特定部分(Node JS)

node.js - 用于回发的 Bot 框架事件?

sequelize.js - sequelize(和 sequelize-cli)queryInterface.createTable 在 PostgreSQL 上,PK id 类型为 UUID,defaultValue : Sequelize. DataTypes.UUIDV4 失败