详情页标题前

腾讯云Serverless应用中心连接 MySQL 数据库-同尘科技

详情页1

操作场景

目前,腾讯云原生数据库 TDSQL-C 已支持 Serverless MySQL 版本,做到按实际使用的计算和存储量计费,按秒计量,按小时结算。Serverless Cloud Framework 的 CynosDB 组件也已经支持该类型数据库的创建。本文以 Node.js 开发语言的函数,指导您快速创建 TDSQL-C Serverless MySQL 实例,并在云函数中进行调用。

操作步骤

操作步骤 操作说明
步骤1:配置环境变量
步骤2:配置私有网络 通过 Serverless Cloud Framework VPC 组件 创建 VPC 和 子网,支持云函数和数据库的网络打通和使用。
步骤3:配置 Serverless DB 通过 Serverless Cloud Framework Cynosdb 组件创建 MySQL 实例,为云函数项目提供数据库服务。
步骤4:编写业务代码 通过 Serverless DB SDK 调用数据库,云函数支持直接调用 Serverless DB SDK,连接 PostgreSQL 数据库进行管理操作。
步骤5:部署应用 通过 Serverless Cloud Framework 部署项目至云端,并通过云函数控制台进行测试。
步骤6:移除项目(可选) 可通过 Serverless Cloud Framework 移除项目。

步骤1:配置环境变量

1. 在本地建立目录,用于存放代码及依赖模块。本文以 test-MySQL 文件夹为例。

mkdir test-MySQL && cd test-MySQL

2. 由于目前 TDSQL-C Serverless 只支持 ap-beijing-3ap-guangzhou-4ap-shanghai-2ap-nanjing-1 四个区域,所以这里还需要配置下,只需要在项目根目录下创建 .env 文件,然后配置 REGIONZONE 两个环境变量:说明:REGION:地域。表示资源所在的地域,每个地域包含一个或多个可用区。ZONE:可用区。指腾讯云在同一地域内电力和网络互相独立的物理数据中心。目标是能够保证可用区之间故障相互隔离,不出现故障扩散,使得用户的业务持续在线服务。您可以通过 查询可用区列表 查看完整的可用区列表。

# .envREGION=xxx  ZONE=xxx 

步骤2:配置私有网络

1.test-MySQL 目录下创建文件夹 VPC

mkdir VPC && cd VPC

2.VPC 中新建 serverless.yml 文件,使用 VPC 组件 完成私有网络和子网的创建。
serverless.yml 示例内容如下(全量配置参考 产品文档):

#serverless.ymlapp: mysql-appstage: devcomponent: vpc # (required) name of the component. In that case, it's vpc.name: mysql-app-vpc # (required) name of your vpc component instance.inputs:    region: ${env:REGION}    zone: ${env:ZONE}    vpcName: serverless-mysql    subnetName: serverless-mysql

步骤3:配置 Serverless DB

1.test-MySQL 下创建文件夹 DB。2.DB 文件夹下新建 serverless.yml 文件,并输入以下内容,通过 Serverless Cloud Framework 组件完成云开发环境配置。
serverless.yml 示例内容如下(全量配置参考 产品文档):

# serverless.yml app: mysql-appstage: devcomponent: cynosdbname: mysql-app-dbinputs:  region: ${env:REGION}  zone: ${env:ZONE}  vpcConfig:    vpcId: ${output:${stage}:${app}:mysql-app-vpc.vpcId}    subnetId: ${output:${stage}:${app}:mysql-app-vpc.subnetId}

步骤4:编写业务代码与配置文件

1.test-MySQL 下创建文件夹 src,用于存放业务逻辑代码和相关依赖项。2.src 文件夹下创建文件 index.js,并输入如下示例代码。在函数中通过 SDK 连接数据库,并在其中完成 MySQL 数据库的调用。

exports.main_handler = async (event, context, callback) => {    var mysql      = require('mysql2');    var connection = mysql.createConnection({    host     : process.env.HOST,    user     : 'root',    password : process.env.PASSWORD    });    connection.connect();    connection.query('SELECT 1 + 1 AS solution', function (error, results, fields) {    if (error) throw error;    console.log('The solution is: ', results[0].solution);    });    connection.end(); }

3. 安装所需依赖模块。

npm install mysql2@2.3.3

4. 完成业务代码编写和依赖安装后,创建 serverless.yml 文件,示例文件如下:

app: mysql-appstage: devcomponent: scfname: mysql-app-scf
inputs: src: ./ functionName: ${name} region: ${env:REGION} runtime: Nodejs10.15 timeout: 30 vpcConfig: vpcId: ${output:${stage}:${app}:mysql-app-vpc.vpcId} subnetId: ${output:${stage}:${app}:mysql-app-vpc.subnetId} environment: variables: HOST: ${output:${stage}:${app}:mysql-app-db.connection.ip} PASSWORD: ${output:${stage}:${app}:mysql-app-db.adminPassword}

步骤5:快速部署

完成创建后,项目目录结构如下:

   ./test-MySQL   ├── vpc   │   └── serverless.yml # vpc 配置文件   ├── db   │   └── serverless.yml # db 配置文件   ├── src   │   ├── serverless.yml # scf 组件配置文件   │   ├── node_modules # 项目依赖文件   │   └── index.js # 入口函数   └── .env # 环境变量文件

1. 使用命令行在 test-MySQL 下,执行以下命令进行部署。

scf deploy

说明部署时需要扫码授权,如果没有腾讯云账号,请先 注册新账号。如果是子账号,请参考 子账号权限配置 完成授权。返回结果如下所示,即为部署成功。

mysql-app-vpc:   region:        xxx  zone:          xxx  vpcId:         xxxx-xxx  ...
mysql-app-db: dbMode: xxxx region: xxxx zone: xxxx ...
mysql-app-scf: functionName: xxxx description: xxx ...
59s › test-MySQL › "deploy" ran for 3 apps successfully.

2. 部署成功后,您可通过 云函数控制台,查看并进行函数调试,测试成功如下图所示:

腾讯云Serverless应用中心连接 MySQL 数据库-同尘科技



步骤6:移除项目(可选)

test-MySQL 目录下,执行以下命令可移除项目。

scf remove

返回如下结果,即为成功移除。

serverless-cloud-framework4s › test-MySQL › Success

示例代码

Python

Python 可使用云函数环境已经内置的 pymysql 依赖包进行数据库连接。示例代码如下:

# -*- coding: utf8 -*-from os import getenv
import pymysqlfrom pymysql.err import OperationalError
mysql_conn = None
def __get_cursor(): try: return mysql_conn.cursor() except OperationalError: mysql_conn.ping(reconnect=True) return mysql_conn.cursor()
def main_handler(event, context): global mysql_conn if not mysql_conn: mysql_conn = pymysql.connect( host = getenv('DB_HOST', ''), user = getenv('DB_USER',''), password = getenv('DB_PASSWORD',''), db = getenv('DB_DATABASE',''), port = int(getenv('DB_PORT','')), charset = 'utf8mb4', autocommit = True )
with __get_cursor() as cursor: cursor.execute('select * from employee') myresult = cursor.fetchall() print(myresult) for x in myresult: print(x)

Node.js

Node.js 支持使用连接池进行连接,连接池具备自动重连功能,可有效避免因云函数底层或者数据库释放连接造成的连接不可用情况。示例代码如下:说明使用连接池前需先安装 mysql2 依赖包,详情请参见 依赖安装。

'use strict';
const DB_HOST = process.env[`DB_HOST`]const DB_PORT = process.env[`DB_PORT`]const DB_DATABASE = process.env[`DB_DATABASE`]const DB_USER = process.env[`DB_USER`]const DB_PASSWORD = process.env[`DB_PASSWORD`]
const promisePool = require('mysql2').createPool({ host : DB_HOST, user : DB_USER, port : DB_PORT, password : DB_PASSWORD, database : DB_DATABASE, connectionLimit : 1}).promise();
exports.main_handler = async (event, context, callback) => { let result = await promisePool.query('select * from employee'); console.log(result);}

PHP

PHP 可使用 pdo_mysqlmysqli 依赖包进行数据连接。示例代码如下:pdo_mysql

setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);}catch(PDOException $e){echo '数据库连接失败: '.$e->getMessage();exit;}}

mysqli

<?phpfunction main_handler($event, $context) {   $host = "";  $username = "";  $password = "";
// 创建连接 $conn = mysqli_connect($servername, $username, $password);
// 检测连接 if (!$conn) { die("Connection failed: " . mysqli_connect_error()); } echo "连接成功"; 
mysqli_close($conn); echo "断开连接"; }?>

Java

1. 请参考 依赖安装,安装以下依赖。

            com.tencentcloudapi        scf-java-events        0.0.2                com.zaxxer        HikariCP        3.2.0                mysql        mysql-connector-java        8.0.11    

2. 使用 Hikari 连接池进行连接,示例代码如下:

package example;
import com.qcloud.scf.runtime.Context;import com.qcloud.services.scf.runtime.events.APIGatewayProxyRequestEvent;import com.qcloud.services.scf.runtime.events.APIGatewayProxyResponseEvent;import com.zaxxer.hikari.HikariConfig;import com.zaxxer.hikari.HikariDataSource;
import javax.sql.DataSource;import java.sql.Connection;import java.sql.PreparedStatement;import java.sql.ResultSet;import java.sql.SQLException;import java.util.HashMap;import java.util.Map;
public class Http { private DataSource dataSource;
public Http() { HikariConfig config = new HikariConfig(); config.setJdbcUrl("jdbc:mysql://" + System.getenv("DB_HOST") + ":"+ System.getenv("DB_PORT") + "/" + System.getenv("DB_DATABASE")); config.setUsername(System.getenv("DB_USER")); config.setPassword(System.getenv("DB_PASSWORD")); config.setDriverClassName("com.mysql.jdbc.Driver"); config.setMaximumPoolSize(1); dataSource = new HikariDataSource(config); }
public String mainHandler(APIGatewayProxyRequestEvent requestEvent, Context context) { System.out.println("start main handler"); System.out.println("requestEvent: " + requestEvent); System.out.println("context: " + context);
try (Connection conn = dataSource.getConnection(); PreparedStatement ps = conn.prepareStatement("SELECT * FROM employee")) { ResultSet rs = ps.executeQuery(); while (rs.next()) { System.out.println(rs.getInt("id")); System.out.println(rs.getString("first_name")); System.out.println(rs.getString("last_name")); System.out.println(rs.getString("address")); System.out.println(rs.getString("city")); } } catch (SQLException e) { e.printStackTrace(); }
APIGatewayProxyResponseEvent apiGatewayProxyResponseEvent = new APIGatewayProxyResponseEvent(); apiGatewayProxyResponseEvent.setBody("API GW Test Success"); apiGatewayProxyResponseEvent.setIsBase64Encoded(false); apiGatewayProxyResponseEvent.setStatusCode(200);
Map headers = new HashMap(); headers.put("Content-Type", "text"); headers.put("Access-Control-Allow-Origin", "*"); apiGatewayProxyResponseEvent.setHeaders(headers);
return apiGatewayProxyResponseEvent.toString(); }}

SCF DB SDK for MySQL

为了方便使用,云函数团队将 Node.js 和 Python 连接池相关代码封装为 SCF DB SDK for MySQL,请参考 依赖安装 进行安装使用。通过该 SDK,您可以在云函数代码中连接 MySQL、TDSQL-C 或 TDSQL MySQL版 数据库,并实现对数据库的插入、查询等操作。SCF DB SDK for MySQL 具备以下特点:自动从环境变量初始化数据库客户端。SDK 会在全局维护一个数据库长连接,并处理连接中断后的重连。云函数团队会持续关注 issue,确保获得连接即可用,不需要关注数据库连接。
1. Node.js SDK

'use strict';const database = require('scf-nodejs-serverlessdb-sdk').database;
exports.main_handler = async (event, context, callback) => { let pool = await database('TESTDB2').pool() pool.query('select * from coffee',(err,results)=>{ console.log('db2 callback query result:',results) }) // no need to release pool
console.log('db2 query result:',result)}

说明Node.js SDK 具体使用方法请参考 SCF DB SDK for MySQL。2. Python SDK

from serverless_db_sdk import database
def main_handler(event, context): print('Start Serverlsess DB SDK function')
connection = database().connection(autocommit=False) cursor = connection.cursor()
cursor.execute('SELECT * FROM name') myresult = cursor.fetchall()
for x in myresult: print(x)



官网1折活动,限时活动,即将结束,速速收藏
同尘科技为腾讯云授权服务中心。
购买腾讯云产品享受折上折,更有现金返利。同意关联立享优惠

转转请注明出处:https://www.yunxiaoer.com/149067.html

(0)
上一篇 2023年12月9日 下午1:12
下一篇 2023年12月9日 下午1:12
详情页2

相关推荐

  • 腾讯云TDSQL-C MySQL版功能简介

    背景 随着越来越多的用户将核心系统上云,用户数据量不断增加,业务逻辑也变得越来越复杂。虽然 TDSQL-C MySQL 版的云原生架构可以较好地处理业务的事务请求,但是对于用户多样化的查询分析需求,基于行存的查询并不能总是满足用户的响应时间要求。一种常见的解决方案是采用数据同步工具,将事务系统的数据复制到独立的分析系统中,并将用户的查询分析路由到分析系统中,…

    2023年12月9日
  • 腾讯云TDSQL-C MySQL版调整计算配置

    当实例性能无法满足业务变化或实例性能过剩时,可对实例进行变配操作,以满足业务诉求或节省成本。本文为您介绍如何调整 TDSQL-C MySQL 版的计算规格。 变配能力 TDSQL-C MySQL 版采用计算和存储分离的架构,所有计算节点共享一份数据。在跨机变配的场景下,完全无需搬迁数据,所以能够支撑秒级的配置升降级能力。当实例变配时,会自动拉起一个高规格的从…

    2023年12月9日
  • 腾讯云云直播直播审核

    云直播可对直播流进行智能审核,直播审核包括直播画面审核和直播音频审核,直播画面审核以当月累计审核图片张数为结算标准,直播音频审核以当日累计审核音频的总时长为结算标准。 注意事项 直播画面审核和直播音频审核的返回内容存储于对象存储 COS 中,使用后将产生 COS 存储费用,详情请参见 COS 产品计费定价。使用直播画面审核功能,每月有1000张免费画面审核额…

    腾讯云 2023年12月9日
  • 信息流广告,信息流部分建议宽度830px,只针对默认列表样式,顺序随机
  • 腾讯云专属可用区(CDZ)联系我们云淘

    售前咨询 当您需要购买咨询时,您可以直接通过 售前咨询 进行提问,会有专属客户经理在线为您解答,为您提供专业的上云方案。同时,您也可以直接致电销售人员,咨询热线:4009100100转1(工作日9:00 – 18:00)。 售后支持 当您遇到问题需要处理时,您可以直接通过 售后支持 进行提问,腾讯云工程师7 × 24小时在线为您提供服务。同时,您…

    2023年12月9日
  • 腾讯云容器服务镜像缓存同尘科技

    镜像缓存概述 使用镜像缓存可以在创建实例时加速拉取镜像,减少实例的启动耗时。该能力适用于 TKE Serverless 集群 Pod 和超级节点。本文主要介绍镜像缓存的工作原理、计费说明、创建和使用方式等。 工作原理 镜像缓存加速启动实例时会事先启动一个 容器实例 进行镜像拉取,该镜像存储在一个可自定义大小的数据盘中,同时将该数据盘作为云盘快照缓存,即镜像数…

    2023年12月9日

联系我们

400-800-8888

在线咨询: QQ交谈

邮件:admin@example.com

工作时间:周一至周五,9:30-18:30,节假日休息

关注微信
本站为广大会员提供阿里云、腾讯云、华为云、百度云等一线大厂的购买,续费优惠,保证底价,买贵退差。