Raspberry Pi 4 的後端修鍊 - sequelize-cli
¶Raspberry Pi 4 的後端修鍊: sequelize-cli
¶安裝
sequelize[1]
npm install --save sequelize mysql2 |
要使用 mariadb 要安裝 mysql2
並且把 config 的 “dialect” 設成 “mysql” (後面會講)
sequelize-cli[2]
npm install -g --save sequelize-cli |
安裝好,確定一下安裝成功
sequelize --version |
問題: Unable to resolve sequelize package
因為sequelize-cli
不會幫你安裝sequelize
所以 shell 執行sequelize
時會出現呼叫不到sequelize
指令說明
npx sequelize |
分成幾個部份
初始化
指令 | 作用 |
---|---|
sequelize init | 初始化 project(包含下面四個) |
sequelize init:config | 初始化 configuration |
sequelize init:migrations | 初始化 migrations |
sequelize init:models | 初始化 models |
sequelize init:seeders | 初始化 seeders |
資料庫 建立/刪除
使用時注意權限是否可以更動資料庫
指令 | 作用 |
---|---|
sequelize db:create | 從指定的 config 檔新增 database |
sequelize db:drop | 從指定的 config 檔刪除 database |
產生各種腳本
指令 | 作用 | 參數 |
---|---|---|
sequelize migration:generate | 產生 new migration 檔 | [別名: migration:create] |
sequelize model:generate | 產生 model 和它的 migration 檔 | [別名: model:create] |
sequelize seed:generate | 產生 new seed 檔 | [別名: seed:create] |
資料表結構維護
指令 | 作用 |
---|---|
sequelize db:migrate | 執行未跑過的 migrations |
sequelize db:migrate:undo | 恢復一次 migration |
sequelize db:migrate:undo:all | 恢復所有跑過的 migrations |
sequelize db:migrate:schema:timestamps:add | Update migration table to have timestamps |
sequelize db:migrate:status | List the status of all migrations |
前置資料維護
指令 | 作用 |
---|---|
sequelize db:seed | 執行指定的 seeder |
sequelize db:seed:all | 執行每一個 seeder |
sequelize db:seed:undo | 從 database 刪除資料 |
sequelize db:seed:undo:all | 從 database 刪除資料 |
¶初始化 sequelize 的基本環境
sequelize 的 cli 工具,可以做到很多事情,不過大多都在處理 migration。
sequelize init |
執行完會出現
project/ |
config
, 包含 config 檔案, 提供資料庫連線給 CLImodels
, 包含專案中所有的 modelsmigrations
, 包含所有的 migration 檔案seeders
, 包含所有的 seed 檔案
在此出現幾個陌生的名詞
- CLI: command line interface
- models: MVC 的 model,用來和資料庫連動的物件定義
- migration: 資料庫變動記錄
- seed: 餵資料,通常是資料庫的系統初始資料
ORM 工具管理資料表變化,都會使用 migration。
它就像是 git 這種版本控制工具,只是它版控的是 table schema (只有管有哪些資料表與有哪些資料表的欄位)
¶資料庫連線設定
sequelize 要連線資料庫要靠 config/config.json
這裡的資訊。
config/config.json
環境變數就會對應到預設 config 的 development
, test
, production
三種情境,可依需要增減。
dialect: 翻譯到不同資料庫的 statement[3]
在此,我使用的是 mariadb,所以 “dialect” 設定成 “mariadb” “mysql” 才會跑。(不知道為什麼的雷點!)
如果有 operatorsAliases: false
營運商別名,保持預設值就好。(我目前是刪掉它)
{ |
三個的使用情境,我自己會這麼使用
development
用在開發者變動(新增/刪除/修改)資料庫、資料表結構
production
用在平常的執行時使用的設定 (給 CD/CI 起動時用的)
test
還沒想到。
¶用 ORM 創造資料庫
npx sequelize db:create booklibrary |
因為用 cli 所以 env 要自帶在 env 參數
預設 env 參數是 “development”
db:create 要使用權限較高的帳號執行。
在此設定在 development
的 config 中。
¶用 ORM 創造 Migration 步驟
Migration 像是資料庫的演進過程,每一步都記錄下來的話,有助於未來再建立一次初始系統。
也有助於自動化資料表建置、修改或系統的初始資料建置。
但是 migration 畢竟一開始算是「一個動作」我們就以這個角度切入看看 sequelize-cli 幫我們打造了什麼工具又可以做到什麼吧!
一開始我們創一個 Migration 檔來執行或恢復。
$ npx sequelize-cli migration:generate --name create-empty-file |
可以產生一個 migration 檔。
migrations/20210820152155-create-empty-file.js
1 | ; |
配合上面的 Example (source code 產生的)
queryInterface
: 用來修改 DatabaseSequelize
: 用來記可以用的資料型別 (ex: STRING, INTEGER)- function up, down: 回傳 promise
¶執行 migration
執行到底
sequelize-cli db:migrate |
恢復到底
sequelize db:migrate:undo:all |
¶此也可以加上 transaction
透過 queryInterface.sequelize.transaction(done => {})
可以在 callback 裡面執行 一次 transaction 的所有行為。並且在每個行為的最後一個參數加上 , { transaction: done }
1 | module.exports = { |
¶此也可以含有 forang key
1 | module.exports = { |
改寫成 async/await
1 | module.exports = { |
¶一併創造資料表
可以在建立 migration 的同時,也產生好對應 Model 檔案。
sequelize model:generate --name authors --attributes author_id:number,name_last:string,name_first:string,country:string |
- author_id:number
- name_last:string
- name_first:string
- country:string
產生 models/authors.js
1 | ; |
產生 migrations/20210501084235-create-authors.js
這裡做一點修改,我們想要讓 id 用 author_id 表示
1 | ; |
describe authors; |
+------------+--------------+------+-----+---------+----------------+ |
¶用 ORM 創造資料
為了在 migration 可以預先填入資料
npx sequelize-cli seed:generate --name base-authors |
seeders/20210501134052-base-authors.js
1 | ; |
執行
npx sequelize db:seed |
看資料是否有加進去資料庫
select * from authors; |
+-----------+-----------+------------+----------------+---------------------+---------------------+ |
返回上次填入資料的動作
npx sequelize-cli db:seed:undo |
指定檔案返回填入資料的動作
npx sequelize-cli db:seed:undo --seed seeders/20210501134052-base-authors.js |
返全部填入資料的動作
npx sequelize-cli db:seed:undo:all |