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

avatar-img
18會員
37內容數
這個專題用來存放我在學習網頁開發時的心得及知識。
留言0
查看全部
avatar-img
發表第一個留言支持創作者!
Jeremy Ho的沙龍 的其他內容
LeetCode 518. Coin Challenge II / 動態規劃
LeetCode 518. Coin Challenge II / 動態規劃
你可能也想看
Google News 追蹤
Thumbnail
這個秋,Chill 嗨嗨!穿搭美美去賞楓,裝備款款去露營⋯⋯你的秋天怎麼過?秋日 To Do List 等你分享! 秋季全站徵文,我們準備了五個創作主題,參賽還有機會獲得「火烤兩用鍋」,一起來看看如何參加吧~
Thumbnail
11/20日NVDA即將公布最新一期的財報, 今天Sell Side的分析師, 開始調高目標價, 市場的股價也開始反應, 未來一週NVDA將重新回到美股市場的焦點, 今天我們要分析NVDA Sell Side怎麼看待這次NVDA的財報預測, 以及實際上Buy Side的倉位及操作, 從
Thumbnail
Hi 大家好,我是Ethan😊 相近大家都知道保濕是皮膚保養中最基本,也是最重要的一步。無論是在畫室裡長時間對著畫布,還是在旅途中面對各種氣候變化,保持皮膚的水分平衡對我來說至關重要。保濕化妝水不僅能迅速為皮膚補水,還能提升後續保養品的吸收效率。 曾經,我的保養程序簡單到只包括清潔和隨意上乳液
SQL 中的 Index 是什麼? 加了以後會有什麼影響? 想像你在讀一本厚厚的小說,裡面有幾百頁。如果你想要找到某個關鍵情節,比如「主角第一次登場的地方」,如果你沒有做任何標記,你可能得從頭到尾翻書,直到找到那一頁為止,這樣會花很多時間。 ▌Index 就像書籤一樣
Thumbnail
上一篇我們介紹了SQL基本架構和語法,如何用簡單的SELECT 和 FROM 撈取資料。本篇我們來討論,如何根據指定的條件來篩選資料,僅返回符合條件的結果。
Thumbnail
SQL 基本篇 - CRUD、運算子、內建函式
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
這個秋,Chill 嗨嗨!穿搭美美去賞楓,裝備款款去露營⋯⋯你的秋天怎麼過?秋日 To Do List 等你分享! 秋季全站徵文,我們準備了五個創作主題,參賽還有機會獲得「火烤兩用鍋」,一起來看看如何參加吧~
Thumbnail
11/20日NVDA即將公布最新一期的財報, 今天Sell Side的分析師, 開始調高目標價, 市場的股價也開始反應, 未來一週NVDA將重新回到美股市場的焦點, 今天我們要分析NVDA Sell Side怎麼看待這次NVDA的財報預測, 以及實際上Buy Side的倉位及操作, 從
Thumbnail
Hi 大家好,我是Ethan😊 相近大家都知道保濕是皮膚保養中最基本,也是最重要的一步。無論是在畫室裡長時間對著畫布,還是在旅途中面對各種氣候變化,保持皮膚的水分平衡對我來說至關重要。保濕化妝水不僅能迅速為皮膚補水,還能提升後續保養品的吸收效率。 曾經,我的保養程序簡單到只包括清潔和隨意上乳液
SQL 中的 Index 是什麼? 加了以後會有什麼影響? 想像你在讀一本厚厚的小說,裡面有幾百頁。如果你想要找到某個關鍵情節,比如「主角第一次登場的地方」,如果你沒有做任何標記,你可能得從頭到尾翻書,直到找到那一頁為止,這樣會花很多時間。 ▌Index 就像書籤一樣
Thumbnail
上一篇我們介紹了SQL基本架構和語法,如何用簡單的SELECT 和 FROM 撈取資料。本篇我們來討論,如何根據指定的條件來篩選資料,僅返回符合條件的結果。
Thumbnail
SQL 基本篇 - CRUD、運算子、內建函式
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