SQL | MySQL 專案應用篇

閱讀時間約 7 分鐘

好,會寫這一篇其實是因為我在 AWS 部署之前做過的 URL Shortener 專案時發生了問題,原因在於我原本是用 NoSQL 的 MongoDB 來管理資料,但既然要用 AWS 的 RDS 來託管資料勢必得更動原先專案裡的資料庫設定,所以咱就跑去學了 MySQL😐

前言 - MongoDB 版

Ok,要改動資料之前,要先來看看我之前是怎麼用 MongoDB 和它的 ODM Mongoose 來建立管理資料的資料庫的。首先,我們要管理的資料有:

  1. 使用者要轉換的網址。
  2. 轉換後的網址。

在原先的 MongoDB 版本中,我先在 models/url.js 中建立資料的結構,長像這樣:

// 載入 mongoose
const mongoose = require('mongoose')

const Schema = mongoose.Schema

const urlSchema = new Schema({
origin: {
type: String,
required: true
},
transfer: {
type: String
}
})

// 匯出資料型態
module.exports = mongoose.model('URL', urlSchema)

然後在 config/mongoose.js 中進行資料庫連線,像這樣:

// 載入 mongoose
const mongoose = require('mongoose')

// 僅在開發環境使用 dotenv
if(process.env.NODE_ENV !== 'production'){
require('dotenv').config()
}

// 連線到 mongoDB
mongoose.connect(process.env.MONGODB_URI, { useNewUrlParser: true, useUnifiedTopology: true })

// 取得資料庫連線狀態
const db = mongoose.connection
// 連線異常
db.on('error', ()=>{
console.log('mongoDB error!')
})
// 連線成功
db.once('open', ()=>{
console.log('mongoDB connected!')
})

// 匯出連線狀態
module.exports = db

然後這些東西呢,等等到 MySQL 版就通通不需要囉,呵呵!



MySQL 版 - 前置準備

接下來,要來把資料管理改成 MySQL,在那之前要先把需要的東西安裝好。

  1. MySQL 資料庫與 Workbench。在安裝時記得選擇 "Full",那就會連同 Workbench 一同安裝。
  2. 打開 Workbench,咱們來建立資料庫囉!
drop database if exists url_shortener;
create database url_shortener;
use url_shortener;
raw-image
  1. 現在終端機 cd 到專案路徑,安裝 mySQL、Sequelize、和 Sequelize CLI。Sequelize 是 MySQL 的 ORM。Sequelize CLI 是 Sequelize 提供的一系列事先設定好的腳本,可以非常快速地幫我們進行資料庫設定。
npm install mysql2 sequelize sequelize-cli



MySQL 版 - 設定篇

該裝的都裝完了,來設定吧!

  1. 初始化設定,這裡執行完會發現 Sequelize 非常貼心地把需要的資料夾與設定檔都建完了,包括:config/config.json、models/index.js、migrations、seeders。
npx sequelize init
raw-image
  1. 打開 config/config.json,可以看到 Sequelize 把資料庫連線的相關設定都寫好了,我們不用像寫 Mongoose 一樣自己從頭寫設定啦!進去後找到 development 環境,在 password 與 database 輸入自己的密碼以及要連線的資料庫名稱。如果有 operatorsAliases 設定記得刪掉。最後會看起來像這樣:
raw-image
  1. 設定 model。這裡一樣會用 Sequelize CLI 來幫忙建立 model。建立完會發現多出 models/url.js 和 migrations/XXX-create-url.js 兩個檔案。
npx sequelize model:generate --name Url --attributes origin:string,transfer:string
  1. 打開那個 migrations/XXX-create-url.js,來把必填的項目加上 allowNull: false,在這裡我設定一定要存入一個原始未轉換的網址。
raw-image
  1. 執行資料庫遷徙。現在就是把我們在專案中寫入的設定通知 MySQL 資料庫來幫忙建立資料囉 ~
npx sequelize db:migrate
  1. 現在回到 Workbench,執行select * from urls;,看到類似下面這張圖就是成功了:
raw-image
  1. 改完資料庫設定,現在必須把原本引用 Mongoose 的 config 和 model 的地方給改掉,以首頁為例:
// 引入資料庫設定
const db = require('../../models')
const Url = db.Url

// 更改原本的操作
router.post('/shortener', async (req, res)=>{
    try{
        const originUrl = req.body.url
        const data = await Url.findOne({where: {origin: originUrl}})
        if(data){
            res.render('shortener', {transfer: data.transfer})
        }else{
            const shorterUrl = urlShortener()
            Url.create({origin: originUrl, transfer: shorterUrl})
            .then(() => res.render('shortener', { transfer: shorterUrl }))
            .catch(error => console.log(error))
        }
    }catch (error){
        console.log(error)
    }
})
  1. 現在咱們測試看看,實際測試一個網址,看到資料庫確實存入使用者輸入的網址以及轉換後的網址啦!嗯,大功告成啦!
raw-image

下篇回到 AWS 部署...www

18會員
37Content count
這個專題用來存放我在學習網頁開發時的心得及知識。
留言0
查看全部
發表第一個留言支持創作者!
Jeremy Ho的沙龍 的其他內容
LeetCode 518. Coin Challenge II / 動態規劃
LeetCode 518. Coin Challenge II / 動態規劃
你可能也想看
Thumbnail
重點摘要: 1.9 月降息 2 碼、進一步暗示年內還有 50 bp 降息 2.SEP 上修失業率預期,但快速的降息速率將有助失業率觸頂 3.未來幾個月經濟數據將繼續轉弱,經濟復甦的時點或是 1Q25 季底附近
Thumbnail
近期的「貼文發佈流程 & 版型大更新」功能大家使用了嗎? 新版式整體視覺上「更加凸顯圖片」,為了搭配這次的更新,我們推出首次貼文策展 ❤️ 使用貼文功能並完成這次的指定任務,還有機會獲得富士即可拍,讓你的美好回憶都可以用即可拍珍藏!
MySQL中欄位數字相加可以很容易達成: 但假如其中一個欄位是null,最終的total也會是null,可能不符合預期需求。 解決方法,使用COALESCE將null轉為0:
Thumbnail
本筆記參考: 1. https://www.w3schools.com/sql/func_mysql_date_format.asp
Thumbnail
有了MySQL後,當然就要下指令來玩玩 能玩爆代表你有天賦,每一次爆炸你又能修復就是成長大躍進的時刻 但是看看你的資料庫空空如也,只有系統DB怎麼辦咧 還好網路上有很多善心人士願意分享範例資料庫供人使用 話不多說就來試試看吧  1. 先找到你要的範例資料庫 範例資料庫下載
Thumbnail
網路隨便估狗都有一堆大神教學文,不過還是紀錄一下自己安裝的步驟 (2021.11.7)身為一個linux和資料庫菜雞只能乖乖腳踏實地一步一步來 準備好環境 (廢話) 1. 先準備好環境 (廢話) 我是用virtualbox起一個CentOS7的虛擬機詳細以參考以下網址,有非常詳盡的步驟
Laravel GROUP_CONCAT 出來的json格式錯誤,看起來是字串被截斷了,查了一下發現原來MySQL GROUP_CONCAT select出來的字串會有最大值的限制,預設是1024個字元。 1. 程式端解法:    DB::statement('SET GLOBAL group_c
Thumbnail
MySQL 取得現在日期半年前的日期: DATE_SUB(CURRENT_DATE(), INTERVAL 6 MONTH) 本筆記參考: https://www.w3schools.com/sql/func_mysql_date_sub.asp
以下以Laravel為例,一般group_concat我們可能會這樣寫: E 但其實table_a_id, table_a_name可以merge成一個json,資料整理起來比較好看,可以改成這樣的寫法: E 最後response之前可以用php的json_decode把json string轉為o
有時候我們會需要只group concat某些條件,就可以像這樣寫: group_concat(DISTINCT IF(user.name != 'abc' AND b.b_id != c.c_id, c.name, NULL)) as d 符合這個條件的才給值,否則給null,由於group_co
Thumbnail
由於使用Python爬政府公開資訊進Mysql後,如果只想選取特定字串出來可以使用 WHERE 搭配 Like;但是當我們要尋找的字串非常多時,我們可以使用 REGEXP 的方式篩選,個人覺得比較有效率及程式不會太過冗長,如果有更好的作法也可以在下方回覆唷
Thumbnail
重點摘要: 1.9 月降息 2 碼、進一步暗示年內還有 50 bp 降息 2.SEP 上修失業率預期,但快速的降息速率將有助失業率觸頂 3.未來幾個月經濟數據將繼續轉弱,經濟復甦的時點或是 1Q25 季底附近
Thumbnail
近期的「貼文發佈流程 & 版型大更新」功能大家使用了嗎? 新版式整體視覺上「更加凸顯圖片」,為了搭配這次的更新,我們推出首次貼文策展 ❤️ 使用貼文功能並完成這次的指定任務,還有機會獲得富士即可拍,讓你的美好回憶都可以用即可拍珍藏!
MySQL中欄位數字相加可以很容易達成: 但假如其中一個欄位是null,最終的total也會是null,可能不符合預期需求。 解決方法,使用COALESCE將null轉為0:
Thumbnail
本筆記參考: 1. https://www.w3schools.com/sql/func_mysql_date_format.asp
Thumbnail
有了MySQL後,當然就要下指令來玩玩 能玩爆代表你有天賦,每一次爆炸你又能修復就是成長大躍進的時刻 但是看看你的資料庫空空如也,只有系統DB怎麼辦咧 還好網路上有很多善心人士願意分享範例資料庫供人使用 話不多說就來試試看吧  1. 先找到你要的範例資料庫 範例資料庫下載
Thumbnail
網路隨便估狗都有一堆大神教學文,不過還是紀錄一下自己安裝的步驟 (2021.11.7)身為一個linux和資料庫菜雞只能乖乖腳踏實地一步一步來 準備好環境 (廢話) 1. 先準備好環境 (廢話) 我是用virtualbox起一個CentOS7的虛擬機詳細以參考以下網址,有非常詳盡的步驟
Laravel GROUP_CONCAT 出來的json格式錯誤,看起來是字串被截斷了,查了一下發現原來MySQL GROUP_CONCAT select出來的字串會有最大值的限制,預設是1024個字元。 1. 程式端解法:    DB::statement('SET GLOBAL group_c
Thumbnail
MySQL 取得現在日期半年前的日期: DATE_SUB(CURRENT_DATE(), INTERVAL 6 MONTH) 本筆記參考: https://www.w3schools.com/sql/func_mysql_date_sub.asp
以下以Laravel為例,一般group_concat我們可能會這樣寫: E 但其實table_a_id, table_a_name可以merge成一個json,資料整理起來比較好看,可以改成這樣的寫法: E 最後response之前可以用php的json_decode把json string轉為o
有時候我們會需要只group concat某些條件,就可以像這樣寫: group_concat(DISTINCT IF(user.name != 'abc' AND b.b_id != c.c_id, c.name, NULL)) as d 符合這個條件的才給值,否則給null,由於group_co
Thumbnail
由於使用Python爬政府公開資訊進Mysql後,如果只想選取特定字串出來可以使用 WHERE 搭配 Like;但是當我們要尋找的字串非常多時,我們可以使用 REGEXP 的方式篩選,個人覺得比較有效率及程式不會太過冗長,如果有更好的作法也可以在下方回覆唷