寫在最前
騰訊雲開發最近上新了個能力,能讓微信小程序(當然不止小程序啦~)直接訪問 MySQL 雲數據庫,這給咱們開發者又多了一種直接操作數據庫的方式。具體是咋肥事呢?且聽下文慢慢道來~
前奏鋪墊
丹尼爾:蛋兄,聽説騰訊雲開發近期剛推出一個新功能,現在微信小程序可以直接訪問 MySQL 數據庫了?
蛋先生:喲,消息挺靈通的嘛!其實以前也是可以訪問 MySQL 數據庫的,只是需要通過數據模型來間接操作
丹尼爾:數據模型?
蛋先生:可以理解為數據庫之上的一層 ORM 層
丹尼爾:那既然都可以訪問,有啥不同?
蛋先生:越上層,使用起來會更簡單一些,但限制也會多一些,畢竟是在數據庫之上的一層黑盒封裝。而越接近底層,則會越靈活,開發者能發揮的空間也就越大
丹尼爾:哦,越接近底層,是不是越難了
蛋先生:倒不會啦,畢竟只是一些數據庫使用的淺層知識,這點小菜對開發者們來説不在話下~
JS SDK - 前端開發者的福音
丹尼爾:那具體怎麼用呢?
蛋先生:如果你對前端技術棧比較熟悉,那 js sdk 就是你的最佳選擇了!無論是在 web 應用、服務端 nodejs 應用還是微信小程序裏,都提供了相應的 js sdk 來直接訪問 mysql 數據庫
丹尼爾:舉個栗子?
蛋先生:那我就舉兩個比較有代表性的例子吧:一個是簡單的單表查詢,另一個是稍複雜的多對多查詢。至於其他場景,你可以自己去翻翻官方的文檔,寫得還是挺全面的
丹尼爾:好咧!
✎ 初始化
蛋先生:一切的開始,還是得從初始化説起。通過下面這段代碼,我們就能在微信小程序中創建一個 MySQL 數據庫連接實例。當然,對於 Web 應用或服務端的 Node.js 應用,也可以用類似的方式進行初始化
const { init } = require("@cloudbase/wx-cloud-client-sdk");
...
wx.cloud.init({
env: "{{這裏填上你的雲開發環境 ID 哦}}",
});
const db = init(wx.cloud).mysql();
丹尼爾:OK,代碼灰常的簡單
蛋先生:接下來,我就用下面這三個簡單的表來進行演示
✎ 簡單的單表查詢
蛋先生:先來演示一下最基礎的單表查詢
// 從 `articles` 表中查詢所有 `title` 包含 "雲開發" 的記錄
const { data, error } = await db
.from("articles")
.select("*")
.like("title", "%雲開發%")
// 返回 data 的示例值
[
{
id: 1,
title: "雲開發MySQL新功能詳解",
}
];
丹尼爾:單表查詢確實挺簡單的,一看就明白
✎ 複雜的多對多
蛋先生:那我們再來看一下多對多查詢,其實也同樣很直觀
// 從 `articles` 表中查詢所有記錄,並只返回每條記錄的 id、title 字段,以及關聯的 tags 中的 name 字段
const { data, error } = await db
.from("articles")
.select("id, title, tags(name)")
// 返回 data 的示例值
[
{
id: 1,
tags: [
{
name: "雲開發",
},
{
name: "MySQL",
},
],
title: "雲開發MySQL新功能詳解",
},
{
id: 2,
tags: [
{
name: "微信小程序",
},
],
title: "微信小程序性能優化指南",
}
]
丹尼爾:哇塞,太酷了!我之前用過 Supabase 的 supabase-js SDK,感覺兩者很像啊!
蛋先生:你眼光真準!雲開發的 MySQL JS SDK 在設計上確實和 supabase-js SDK 幾乎一模一樣
丹尼爾:為什麼要這麼設計呢?
蛋先生:我覺得啊,時代不同了。以前完全可以隨意設計自己的 SDK,但現在是 AI 時代,要讓 AI 熟悉一種新的 SDK 使用方式,是需要時間成本的。保持與 supabase-js SDK 一致,可以提高 AI 的適應性,畢竟現在的開發者幾乎都離不開 AI 編程助手。
HTTP API - 非 JS 編程語言開發者的利器
丹尼爾:嗯,確實挺好用的。不過這樣就只限於 JS 了。如果我想用 Go 來訪問 MySQL 雲數據庫,該怎麼辦呢?
蛋先生:雖然目前還沒有提供 Go SDK,但云開發貼心地提供了 HTTP API,所以你可以用任何編程語言寫一個 HTTP 客户端來訪問 MySQL 數據庫
丹尼爾:這個 HTTP API 是什麼樣子的?
蛋先生:同樣為了提高 AI 的適應性,HTTP API 在設計上選擇遵循 PostgREST 標準協議
丹尼爾:哦,那也來用兩個例子演示一下吧
蛋先生:好,那就滿足一下你的好奇心吧
✎ 簡單的單表查詢
蛋先生:一樣的,先來演示一個簡單的單表查詢
# 從 `articles` 表中查詢所有 `title` 包含 "雲開發" 的記錄
curl -i -X GET 'http://{{host}}/v1/rdb/rest/v1/articles?select=*&title=like.%雲開發%' \
-H 'Authorization: Bearer <This is a fake token, please use yours>' \
-H 'Prefer: return=representation'
丹尼爾:不錯,依然簡單明瞭
✎ 複雜的多對多
蛋先生:最後,我們也來演示一個多對多的查詢
# 從 `articles` 表中查詢所有記錄,並只返回每條記錄的 id、title 字段,以及關聯的 tags 中的 name 字段
curl -i -X 'GET http://{{host}}/v1/rdb/rest/articles?select=id,title,tags(name)' \
-H 'Authorization: Bearer <This is a fake token, please use yours>'
丹尼爾:Cool~
控制枱 - 數據庫管理新體驗
蛋先生:這次還配套上線了在線 MySQL 數據庫管理端。功能雖然算不上花哨,但我覺得關聯表功能比以前的數據模型要好一些
丹尼爾:怎麼説?
蛋先生:舉個例子,user_article 模型裏有個字段 user_id 要關聯 user 模型,在配置關聯時,需要聲明在 user 模型中的字段,一開始我還真不適應
丹尼爾:確實,居然可以在 user_article 模型的地盤直接給 user 模型加字段,都不知道 user 模型同意不?
蛋先生:呵呵!還有一個問題,如果 user 模型被多個模型關聯,那簡直就是災難。因為在 user 模型裏會出現多個代表其他模型的字段,如果這裏有 10 個,你可以想象字段在 user 模型中氾濫成災的景象
丹尼爾:嗯,確實如此。那新的 MySQL 數據庫管理端是什麼樣的?
蛋先生:跟你預期的一樣,user_article 表的 user_id 關聯 user 表的 _id,一切都是那麼自然
丹尼爾:哦,那 user 表的字段也不會被污染了
蛋先生:是的,看起來是不是很清爽
丹尼爾:那 user_article 能查看具體關聯的 user 信息嗎?這應該是 user_article 表關心的內容
蛋先生:當然可以
不足與期待
丹尼爾:看起來很不錯啊。哦,對了,我記得以前數據模型提供的 SDK 是沒有事務支持的
蛋先生:是的,這確實是個小硬傷。遺憾的是,這次 MySQL JS SDK 依舊沒帶上。不過嘛,事務本來就主要用在服務端,對小程序等前端調用影響不大。聽説後面是有計劃推出的,然後還有實時推送等這些剛需功能,還是可以小期待一下的~So,在這一塊上,和數據模型算是五五開吧 😅
丹尼爾:嗯,那我先去了解了解,同時期待這些實用的功能儘快上線
寫在最後
“親們,都到這了,要不,點贊或收藏或關注支持下我唄 o( ̄▽ ̄)d”