Raspberry Pi 4 的後端修鍊 (8) - migration 要 foreign key
¶Raspberry Pi 4 的後端修鍊 (8) - migration 要 foreign key
¶「讀者」資料表
CREATE TABLE reader ( |
在加入之前,我想先增加 npm script 的區段,將常用的指令加上去
"scripts": { |
接著輸入指令,訊息會印出原本的指令長怎樣。
npm run new:table -- --name reader --attributes password:string,slack_id:string,line_id:string,phone:string,email:string,creator:integer |
migrations/20230912142904-create-reader.js
- 修改表格名稱,readers -> reader (讓它與真正生成的表格名稱相同)
; |
models/reader.js
; |
¶想要知道的問題
- 預設值 DefaultValue 應該加在哪?migration?model?都加?
- foreign key 的設定 怎麼加?
¶執行 migrate
npm run migrate |
CREATE TABLE IF NOT EXISTS `reader` ( |
比對一下原本想要的 SQL,除了後來覺得需要加的部份,其餘果然和原本想的一模一樣。讚!
CREATE TABLE reader ( |
¶執行後才知道錯
寫了一個程式使用 model
const { Sequelize, DataTypes } = require('sequelize'); |
執行之後,各種錯誤,再重新修改 model 的表示方式。
models/user.js
// ... |
models/reader.js
; |
設定之後,執行
node main.js |
修改一下 main.js
await sequelize.models.user.create({ name: 'chris', password: 'chris' }); |
node main.js |
可以發現 mary.password 是 undefined
也是相同的道理。
改一下 Model 的 password,加上 DefaultValue ,其實也是一樣的結果。
¶心得
Model 主要還是 JS 餵進去的資料為新增時回傳的物件。
並不會依照資料庫 (或 Model) 的預設值而自動幫你加上去,id 也是
除非在新增完之後,再從資料庫撈一次,該在資料表上的內容就會出現在 JS 物件中了。
而 sequelize 在 Model 上可以設定 DefaultValue 的設定,是為了搭配 .sync()
吧?從 Model 新增 Table 的方式。
¶尚未做的
未設定 Model 之間的關聯性
所以 console.log(mary.toJSON())
印出來的 mary 會是這樣
{ |
發表於