資料表名稱是在哪裡定義的?這也是當初我一直困惑很久的,搞不清楚它是怎麼回事,只覺的奇怪。
其實是這樣的。上面的白箭頭,它是Model 的名稱,但是它又是資料表的名稱,甚麼意思呢?
就是它同時是Model的名稱,又同時是資料表的名稱,也就是它幫你做自動對映了。
還不止這樣,你的資料表名稱不是叫users嗎?但它上面是叫「User」不一樣阿!?
對,因為它會自動幫你加上複數s,也就是它會自動變成users,它就找到資料表了。
如果你不想要讓它自動為你的資料表加上s(複數),要如何做呢?就定義 freezeTableName這個參數,設定成 true ,就不會自動幫你加上s了
sequelize.define('User', {
// ... (attributes)
}, {
freezeTableName: true
});
const sequelize = new Sequelize('sqlite::memory:', {
define: {
freezeTableName: true
}
});
但是這種設計我個人是覺的有點雞婆,很容易混肴,程式碼又沒省到多少,重疊的定義實際上造成2個缺點
1、初學者來看,不容易理解
2、到底是有加s還是沒加s,最後還是得去資料庫去確認,實在是沒必要
當然可以理解作者可能是出自於好意,自動幫你做掉複數這個功能,因為資料表在定義時,常常有時有加s,有時沒加s,到底是要加s還是不要加s,他幫你們做掉,你們就不用考慮這些了。
但是對於程式的嚴謹角度來看,勢必還是要定義清楚、不要有模糊猜測的空間, 還是比較好的。
所以它又提供了這個 freezeTableName 變數讓你去凍結自動加上複數s的功能。
如果要直接指定資料表名稱,要如何做呢?
sequelize.define('User', {
// ... (属性)
}, {
tableName: 'users'
});
這樣就是很明確了
想對外分享這則貼文嗎?運用網址更方便呦~