簡體   English   中英

為現有 MySQL 數據庫定義 Sequelize 模型

[英]Defining Sequelize model for existing MySQL database

請就以下問題提出建議。 我想使用 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 模型,它可以“解釋”我的 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 代碼來SELECT id , content FROM test_table`

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

節點沒有返回 'test_table' 的內容,而是一直忽略它:

C:\\Users\\dmitri\\Desktop\\app>node query.js Executing (default): SELECT id , content FROM test_tables AS test_table ;

並返回 []。

它自願跳轉到查詢“test_tables”而不是“test_table”的原因可能是什么? 我在這里完全錯過了什么嗎?

非常感謝!

您應該已經在選項中指定了表名。 刪除這個新表,添加表名選項並重新提升應用程序。

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

順便說一句,我喜歡用駝峰命名我的模型。 TestTable connection.define('TestTable'...

編輯:作為您的評論,我澄清了幾件事:

  • 您可以/必須在定義模型時指定表名。 看我的例子。 指定 tableName 屬性可確保復數不會讓您感到困惑。
  • 你不應該做sequelize.sync() (除非你知道它做什么並且你想要它)。 否則你可能會遇到問題(比如創建另一個表,因為它找不到它要找的表)。
  • 如果您想使用 sequelize,則必須定義模型。 否則它沒有意義,你應該只使用 mysql2。 您必須定義模型以匹配數據庫中的表。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM