云開發(fā) 連接MySQL數(shù)據(jù)庫

2020-07-21 17:55 更新

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ù)傳到小程序端進行渲染的。

一、私有網(wǎng)絡VPC

1、公網(wǎng)與私有網(wǎng)絡訪問數(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)勢

  • 更高質(zhì)量,與其他騰訊云產(chǎn)品共享同一自建的內(nèi)部網(wǎng)絡,由于是內(nèi)部傳輸,不受公網(wǎng)質(zhì)量影響,可用性、時延、丟包率保障大大提高;

  • 更強安全,內(nèi)網(wǎng)連接處于騰訊集團級別的防DDos安全防護下,由于不經(jīng)過廣域 Internet 和運營商鏈路,避免報文在公網(wǎng)傳輸可能被竊取的風險;

  • 內(nèi)網(wǎng)傳輸更快,成本更低,云函數(shù)外網(wǎng)流量是要計費的,而同一地域的內(nèi)網(wǎng)流量則是免費的;

如果你希望云開發(fā)的云函數(shù)使用圖形圖像、音視頻處理等比較消耗資源的服務,以及對安全有比較高要求的MySQL、Redis、TencentDB、Kafka 等服務,我們都建議使用私有網(wǎng)絡。

2、私有網(wǎng)絡服務的創(chuà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文件。

二、使用mysql2操作MySQL

1、使用mysql2連接MySQL

支持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模塊技術文檔.

2、mysql2的增刪改查

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

3、使用serverless-mysql操作MySQL

下面還推薦一個比較好用的包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,后面會有介紹。

以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號