這是在講關於一名叫 Koa 的全端勇士傳說-MySQL篇-sequelize(3)

前言

前面知道可以使用 migrations 來做遷移,而 migrations 也可以方便我們轉移資料到新資料庫(當然不包含資料內容),那麼在實作上該如何透過 sequelize 來取得表單資料並新增資料進去資料表呢?

查詢資料庫

接下來我們來準備修改一下 route 來做一下資料庫查詢,首先先在 route 引入 models

於 route/index.js 修改 get router

1
2
3
4
5
6
7
8
9
10
const models = require('./models');

router.get('/',csrfMD,async (ctx, next) => {
ctx.cookies.set('cid','1234', cookieSet);
await console.log(models.User.findOne({where: {id: 1}}))
await ctx.render('index', {
title: 'EJS !',
csrf: ctx.csrf
});
})

執行之後若沒問題就會看到這個訊息

查詢資料庫

那麼我們該如何打印出資料呢?由於 sequelizejs 是支援 Promise 的,順便我們這邊改寫成使用查詢所有資料並且輸入到前端

1
2
3
4
5
6
7
8
9
10
11
router.get('/',csrfMD,async (ctx, next) => {
ctx.cookies.set('cid','1234', cookieSet);
models.User.findAll()
.then((users) => {
await ctx.render('index', {
title: 'EJS !',
csrf: ctx.csrf,
user: user
});
})
})

由於拉出來的資料會是陣列物件,所以前端必須使用迴圈來做處理

1
2
3
4
5
 <ul>
<% for(item in user) {%>
<li> 姓名:<%- user[item].dataValues.firstName%> </li>
<% } %>
</ul>

你有可能會問說為什麼要 dataValues 才取得資料,因為拉出來的資料都在 dataValues 物件下

dataValues

這麼在這邊我們學會了 findAll() (查詢全部)、findOne() (單一查詢)

但是這邊有幾個地方要注意 findAll()findOne() 都可以加入條件判斷 Where

  • findAll() - 簡單來講就是找一大推,若條件太少資料太多就會影響效能
  • findOne() - 簡單講就是找一個,基本上使用的時候必須考慮尋找的唯一值,與 findAll() 最大差異在於 findAll() 找出來是一個陣列物件,而 findOne() 只是物件

另外補充兩個查詢方式

  • findById() - 這個與 findOne() 類似
  • findOrCreate() - 這個就是當查詢不到的時候就建立一個

另外可以塞入的選項條件有這些

  • limit - 限制數量
  • offset - 略過幾筆
  • group - 群組
  • order - 排序
    • ASC 遞增排序
    • DESC 遞減排序
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
router.get('/',csrfMD,async (ctx, next) => {
ctx.cookies.set('cid','1234', cookieSet);
models.User.findAndCountAll({
where: {id: '1'},
limit: 3,
offset: 0,
order: [
['id', 'DESC']
],
})
.then((users) => {
console.log(users);
await ctx.render('index', {
title: 'EJS !',
csrf: ctx.csrf,
user: user
});
})
})

那麼就會得到這個結果

Options 查詢

參考文獻

Sequelize 資料讀取

egg-sequelize 中order参数问题