MySQL可以說是互聯(lián)網(wǎng)企業(yè)最為流行的數(shù)據(jù)庫,也是最流行的關系型數(shù)據(jù)庫(云開發(fā)數(shù)據(jù)庫是文檔型數(shù)據(jù)庫)。如果你的項目已經(jīng)使用了MySQL,數(shù)據(jù)庫不方便遷移到云開發(fā)數(shù)據(jù)庫或者你的業(yè)務更偏向于使用MySQL,在這種情況下,也是可以使用連接自建的MySQL數(shù)據(jù)庫并把數(shù)據(jù)傳到小程序端進行渲染的。
在服務器自建的MySQL或者在騰訊云等云服務公司購買的關系型數(shù)據(jù)庫服務在開放了外部網(wǎng)絡連接和IP白名單的情況下,都是可以使用云函數(shù)連接的,也就是說云函數(shù)是部署在公共網(wǎng)絡之中的,只能訪問公網(wǎng)的數(shù)據(jù)庫資源(內(nèi)網(wǎng)或本地的數(shù)據(jù)庫是不行的),而你的數(shù)據(jù)庫要能被公網(wǎng)訪問就需要開放外部網(wǎng)絡連接和IP白名單。不過云函數(shù)目前沒有固定的IP,因此數(shù)據(jù)庫需要添加的IP白名單列表會比較長。
如果你不想讓數(shù)據(jù)庫暴露在公網(wǎng)環(huán)境之下,但是又能被云函數(shù)訪問,這里推薦使用騰訊云的私有網(wǎng)絡。處于私有網(wǎng)絡的騰訊云產(chǎn)品(比如云開發(fā)的云函數(shù)和騰訊云的MySQL數(shù)據(jù)庫),可以通過騰訊云提供的對等連接進行互聯(lián)。對等連接服務相比公網(wǎng)傳輸有極大的優(yōu)勢:
如果你希望云開發(fā)的云函數(shù)使用圖形圖像、音視頻處理等比較消耗資源的服務,以及對安全有比較高要求的MySQL、Redis、TencentDB、Kafka 等服務,我們都建議使用私有網(wǎng)絡。
(1)創(chuàng)建上??捎脜^(qū)的私有網(wǎng)絡
騰訊云控制臺需要登錄時,選擇微信公眾號(小程序賬號屬于公眾號體系)的登錄方式,掃碼選擇相應的小程序賬號進行登錄。
打開騰訊云控制臺的私有網(wǎng)絡中免費創(chuàng)建私有網(wǎng)絡,由于私有網(wǎng)絡具有地域(Region)屬性,我們需要在函數(shù)所在的地域來新建私有網(wǎng)絡。云開發(fā)的云函數(shù)的服務器部署在上海,因此你的私有網(wǎng)絡里的資源也要選擇上海。私有網(wǎng)絡有三個核心組成成分:私有網(wǎng)絡網(wǎng)段IPv4 CIDR、子網(wǎng)和路由表。一個私有網(wǎng)絡下的子網(wǎng)可以屬于該地域下不同可用區(qū),同一私有網(wǎng)絡下各個子網(wǎng)內(nèi)資源無論是否在同一可用區(qū)內(nèi),均默認內(nèi)網(wǎng)互通。而初始子網(wǎng)的可用區(qū),你可以根據(jù)你的MySQL等數(shù)據(jù)庫所在的可用區(qū)來選,如果你之前在騰訊云沒有數(shù)據(jù)庫等,選擇上海的任意可用區(qū)即可。
(2)在騰訊云購買MySQL并加入同一私有網(wǎng)絡
打開騰訊云控制臺的MySQL中購買一個實例,創(chuàng)建實例時最主要的是在網(wǎng)絡這里找到你之前創(chuàng)建的私有網(wǎng)絡以及對應的子網(wǎng)(下拉即可)。
(3)將需要連接MySQL的云函數(shù)加入私有網(wǎng)絡
打開騰訊云控制臺的云開發(fā)CloudBase中選擇指定的環(huán)境,然后點擊云函數(shù)菜單,然后新建一個云函數(shù)或者選擇指定的云函數(shù)比如mysql,進入配置頁面后,點擊右上角的“編輯”,在網(wǎng)絡配置選擇和MySQL服務一樣的私有網(wǎng)絡。這樣云函數(shù)就可以通過私有網(wǎng)絡的方式連接MySQL了。
然后我們可以根據(jù)需要或者結合自身的業(yè)務需求,往mysql數(shù)據(jù)庫里導入數(shù)據(jù)或數(shù)據(jù)文件,比如可以使用騰訊與自帶的DMS往里面導入sql文件。
支持Nodejs連接MySQL數(shù)據(jù)庫的庫有很多,比如mysql、mysql2,這里推薦使用mysql2。mysql2是支持async/await的Promise寫法的。
使用開發(fā)者工具打開之前有的mysql云函數(shù)(只要綁定了私有網(wǎng)絡即可,沒有的話可以參照上一步的說明),在package.json里添加latest最新版的mysql2,并右鍵云函數(shù)目錄選擇在終端中打開輸入命令npm install安裝依賴:
"dependencies": {
"wx-server-sdk": "latest",
"mysql2": "latest"
}
然后在index.js里輸入以下代碼,這里需要注意的是我們引入的是mysql2/promise,.query
的第一個參數(shù)是sqlString,也就是SQL命令行語句的字符串格式;當所有數(shù)據(jù)庫請求結束之后,注意要使用.end
斷開連接,不然云函數(shù)會報超時錯誤。
const cloud = require('wx-server-sdk')
cloud.init({
env: cloud.DYNAMIC_CURRENT_ENV,
})
const mysql = require('mysql2/promise');
exports.main = async (event, context) => {
try {
const connection = await mysql.createConnection({
host: "10.168.0.7", //內(nèi)網(wǎng)ip地址
user: "root", //數(shù)據(jù)庫的用戶名
password: "tcb123", //數(shù)據(jù)庫密碼
database: "tcb", //數(shù)據(jù)庫名稱
})
const [rows, fields] = await connection.query(
'SELECT * FROM `country` WHERE `country` = "china"',
);
connection.end(function(err) { //注意要斷開連接,不然盡管獲取到了數(shù)據(jù),云函數(shù)還是會報超時錯誤
console.log('斷開連接')
});
console.log(rows)
console.log(fields)
return rows
} catch (err) {
console.log("連接錯誤", err)
return err
}
}
mysql2模塊的很多參數(shù)的使用與mysql模塊的比較一致,更多配置相關的信息可以查看mysql模塊技術文檔.
mysql2支持數(shù)據(jù)庫的增刪改查,下面只大致列舉一些簡單的案例,更多的資料可以去查看mysql相關的技術文檔:
#創(chuàng)建一個名稱為tcb的數(shù)據(jù)庫
CREATE DATABASE `tcb`
#創(chuàng)建一個包含name、address字段的users表格與刪除表格
CREATE TABLE `users` (`name` VARCHAR(255), `address` VARCHAR(255))
DROP TABLE `users`
#向users表格里插入記錄
INSERT INTO `users`(`name`, `address`) VALUES ('李東bbsky', '深圳')
#查詢users表格
SELECT * FROM `users`
#限制查詢到的記錄數(shù)為20,建議記錄比較多的數(shù)據(jù)表查詢都需指定limit
SELECT * FROM `users` LIMIT 20
#查詢users表格里字段等于某個值的記錄
SELECT * FROM `users` WHERE `name` = '李東bbsky'
#將查詢結果按名稱來排序
SELECT * FROM `users` ORDER BY `name`
#刪除滿足條件的記錄
DELETE FROM `users` WHERE `address` = '深圳'
#更新滿足條件的記錄的字段值
UPDATE `users` SET `address` = "廣州" WHERE `address` = '深圳'
#使用Join進行聯(lián)表查詢
SELECT `users.name` AS `user`, `products.name` AS `favorite` FROM `users` JOIN `products` ON `users.favorite_product` = products.id
下面還推薦一個比較好用的包serverless-mysql,具體使用文檔可以參考serverless-mysql技術文檔
使用開發(fā)者工具打開之前有的mysql云函數(shù),在package.json里添加latest最新版的mysql2,并右鍵云函數(shù)目錄選擇在終端中打開輸入命令npm install安裝依賴:
"dependencies": {
"wx-server-sdk": "latest",
"serverless-mysql": "latest"
}
然后在index.js里輸入以下代碼,這里需要注意的是我們引入的是mysql2/promise,.query
的第一個參數(shù)是sqlString,也就是SQL命令行語句的字符串格式;當所有數(shù)據(jù)庫請求結束之后,注意要使用.end
斷開連接,不然云函數(shù)會報超時錯誤。
const cloud = require('wx-server-sdk')
cloud.init({
env: cloud.DYNAMIC_CURRENT_ENV,
})
const mysql = require('serverless-mysql')
exports.main = async (event, context) => {
const connection = await mysql({
config: {
host : "10.168.0.7",//你
database : "country",
user : "root",
password : "lidongyx327"
}
})
let results = await connection.query('INSERT INTO country(Country, Region) VALUES ("中國","亞洲")')
await connection.end()
return results
}
當然,你還可以使用Sequelize,Sequelize是針對node.js和io.js提供的ORM框架。具體就是突出一個支持廣泛,配置和查詢方法統(tǒng)一。它支持的數(shù)據(jù)庫包括:PostgreSQL、 MySQL、MariaDB、 SQLite 和 MSSQL。技術文檔:Sequelize,這里就不多舉例了。
在云函數(shù)中使用MySQL,每個云函數(shù)在執(zhí)行時就都會與MySQL的server有連接),但數(shù)據(jù)庫的最大連接數(shù)是非常少的(幾百幾千),我們可以在數(shù)據(jù)庫管理里看到并設置這個值max_connections。由于數(shù)據(jù)庫的連接數(shù)比較少,因此建議將數(shù)據(jù)庫的增刪改查都寫在一個云函數(shù)里。這樣會減少云函數(shù)冷啟動的概率以及減少對數(shù)據(jù)庫連接數(shù)的占用,而將增刪改查的處理集中到一個云函數(shù),我們可以使用到云函數(shù)路由tcb-router,后面會有介紹。
更多建議: