【腾讯云 TDSQL-C Serverless 产品体验】使用 Python 向 TDSQL-C 添加读取数据 实现词云图

前言

“腾讯云 TDSQL-C 产品测评活动”是由腾讯云联合 CSDN 推出的针对数据库产品测评及产品体验活动,本次活动主要面向 TDSQL-C Serverless版。

本次参与活动可以涵盖不同技术层面的用户,可以针对TDSQL-C产品的自动弹性能力、自动启停能力、兼容性、安全、并发、可靠性等多方面进行产品的体验和测评,参与活动的同时既可以收获相关技术领域的实战经验同时也可获得丰厚的活动激励。

TDSQL 介绍

产品概述

  • TDSQL-C MySQL 版(TDSQL-C for MySQL)是腾讯云自研的新一代云原生关系型数据库。融合了传统数据库、云计算与新硬件技术的优势,为用户提供具备高弹性、高性能、海量存储、安全可靠的数据库服务。TDSQL-C MySQL 版100%兼容 MySQL 5.7、8.0。实现超百万级 QPS 的高吞吐,最高 PB 级智能存储,保障数据安全可靠。
  • TDSQL-C MySQL 版采用存储和计算分离的架构,所有计算节点共享一份数据,提供秒级的配置升降级、秒级的故障恢复,单节点可支持百万级 QPS,自动维护数据和备份,最高以GB/秒的速度并行回档。
  • TDSQL-C MySQL 版既融合了商业数据库稳定可靠、高性能、可扩展的特征,又具有开源云数据库简单开放、高效迭代的优势。TDSQL-C MySQL 版引擎完全兼容原生 MySQL,您可以在不修改应用程序任何代码和配置的情况下,将 MySQL 数据库迁移至 TDSQL-C MySQL 版引擎。

核心设计理念

Cloud Native 应 “ 云 ” 而生 —— 云原生数据库面向服务架构

TDSQL-C MySQL 版数据库是搭建在腾讯云现有的高效稳定的云服务之上,能快速地搭建出高性能、高可用、高可靠的一套云数据库。

Creative “ 分 ” 而 治之 —— 计算与存储分离,日志即数据库

TDSQL-C MySQL 版实现了“日志即数据库”的架构,将计算(CPU、内存)与存储分离,通过对 MySQL 内核的深度改造,卸载了不必要的功能模块,实现了无状态的计算节点,使得计算资源可以在秒级的时间内完成弹性扩展和故障恢复,并将其构建在腾讯云分布式云存储之上实现了存储资源的池化。

Comprehensive “ 兼 ” 容并包 —— 全面兼容新版开源数据库

100%兼容开源数据库引擎 MySQL,还会定期实现对新版本的支持,几乎无需改动代码,即可完成现有数据库的查询、应用和工具平滑迁移,为用户大大降低数据迁移的成本和风险。

Cohesive 相 “ 辅 ” 相成 —— 极简的软件优化释放硬件红利

TDSQL-C MySQL 版通过数据库内核、系统架构等软件优化,有效提升了数据库性能和稳定性,较传统架构的数据库产品有了大幅提升。在相同硬件条件下性能更为出众,即先释放硬件红利,并完美适配新硬件的发展趋势,最大程度上提升数据库服务效能。

Cost Effective 事半功 “ 倍 ” —— 性能成倍提升,按量计费

我们需要一个在性能上能超过传统数据库的云数据库,并且可以给用户减少成本压力,因为云计算的本身其实是要给客户一个很实惠的服务,所以 TDSQL-C MySQL 版,可实现真正的按量计费和弹性的扩缩容。

应用场景

TDSQL-C MySQL 版为用户提供具备超高弹性、高性能、海量存储、安全可靠的数据库服务,可帮助企业轻松应对诸如商品订单等高频交易、伴随流量洪峰的快速增长业务、游戏业务、历史订单等大数据量低频查询、金融数据安全相关、开发测试、成本敏感等的业务场景。以下为您从互联网移动 APP、游戏应用、电商直播教育行业、金融保险企业来介绍 TDSQL-C MySQL 版能够应对这些业务场景的条件和优势。

互联网移动 App

  • 商用数据库级别的高性能、高可靠,定制开发的多项内核优化以及企业级特性保障业务平稳高效的运行,让研发人员专注于业务逻辑的开发,无后顾之忧。
  • 解决了传统主备架构弹性能力差,业务压力大时的同步效率低,主备切换时间不可控等问题,在提供高性能的同时保证了系统的高可用性和业务的连续性。极大的减轻了运营和运维人员的工作量。
  • 全面兼容开源数据库 MySQL,原有业务应用几乎不用更改即可接入 TDSQL-C MySQL 版,助力企业平滑上云。
  • 自带高可用架构,自动维护数据多副本,自动进行数据的校验和修复,减少人工干预,数据可靠性达99.9999999%。

架构图

在这里插入图片描述

游戏应用

  • 敏捷灵活的弹性扩展,无需预先购买存储,可根据业务需要快速升降级,快速扩容,轻松应对业务峰值。
  • 最高 PB 级海量存储,按存储量计费,自动扩容,免去合区合服的繁琐操作,实现资源和成本的最优配置。
  • 秒级的快照备份和快速回档能力,在多副本的基础上对用户的数据进行连续保护,是互联网和游戏行业的最佳选择。

架构图

在这里插入图片描述

金融保险企业

  • 多可用区架构,在多个可用区内都有数据备份,为数据库提供容灾和备份。
  • 采用白名单、VPC 网络等全方位的手段,对数据库数据访问、存储、管理等各个环节提供安全保障。
  • 采用共享分布式存储的设计,彻底解决了主从(Master-Slave)异步复制所带来的备库数据非强一致性的问题。

架构图

在这里插入图片描述

产品体验

申请TDSQL数据库

1. 点击登录腾讯云

腾讯云地址

2. 点击立即选购 ,如下图所示

在这里插入图片描述

3. 选购页面中的数据库配置选项如下

**注意 **:这里的实例形态我们选择Serverless

 - 实例形态   **(Serverless)**
 -  数据库引擎 **(MYSQL)**
 - 地域  **(北京)**  *地域这里根据自己的实际情况选择即可* 
 - 主可用区 **(北京三区)**   *主可用区这里根据自己的实际情况选择即可* 
 - 多可用区部署 **(否)**
 - 传输链路 
 - 网络
 - 数据库版本 **(MySQL5.7)**
 - 算力配置 **最小(0.25) , 最大(0.5)**
 - 自动暂停 **根据自己需求配置即可**
 - 计算计费模式 **(按量计费)**
 - 存储计费模式 **(按量计费)**

我的配置截图如下:

在这里插入图片描述

4. 基础信息

配置这里我们直接设置自己的密码 以及 表名大小写不敏感即可 , 如下图所示
在这里插入图片描述

5. 配置完成后点击 右下角的立即购买即可

6. 点击立即购买后会有弹窗如下, 再次点击

在这里插入图片描述

7. 购买完成后 , 会出现弹窗 , 点击前往管理页面

8. 读写实例这里 点击开启外部

在这里插入图片描述

9. 创建并授权即可

至此我们的准备工作就完成了, 其实还是蛮简单的哦!

数据准备

所需数据 如下

  • 词频
  • 背景图
  • 字体文件

文件在实验手册里有提供哦

创建项目工程

工程目录如下
在这里插入图片描述

讲解说明:

  1. 文件中的词云图文件夹 做为生成图片的存储路径
  2. background.png 作为词云图背景图
  3. 字体文件则是词云图的字体展示
  4. 词频是数据支撑
  5. wordPhoto.py 为脚本文件

链接 TDSQL

打开数据库读写实例 找到相关配置 如图

# MySQL数据库连接配置
db_config = {
    
    
    'host': "XXXXXX",  # 这里填写你自己申请的外部主机名
    'port': xxxx,   # 这里填写你自己申请的外部的端口
    'user': "root",  # 账户
    'password': "",  # 密码就是你自己创建实例时的密码
    'database': 'tdsql', # 这里需要自己在自己创建的`tdsql`中创建数据库 , 

}

创建数据库

  1. 如图点击登录按钮 , 登录到我们创建的数据库中

在这里插入图片描述

  1. 进入数据库点击新建库
    在这里插入图片描述

  2. 在弹窗中的 数据库名称中写入你喜欢的数据库名称即可 ,这里我们用的是 tdsql , 作为数据库名称 , 填写好数据库名称后,点击确定创建即可
    在这里插入图片描述

  3. 列表中出现我们创建的数据库名称后 , 就表示创建好了 , 我们就可以开始代码编写了哦!
    在这里插入图片描述

代码编写

代码可以根据提供的实验手册进行编写即可 , 这里提供一下完整代码 , 有需要的可以拿走哦


import pymysql
import pandas as pd
import os
import wordcloud
import numpy as np
from PIL import Image
import matplotlib.pyplot as plt

# MySQL数据库连接配置
db_config = {
    
    
    'host': "XXXXXX",  # 这里填写你自己申请的外部主机名
    'port': xxxx,   # 这里填写你自己申请的外部的端口
    'user': "root",  # 账户
    'password': "",  # 密码就是你自己创建实例时的密码
    'database': 'tdsql', # 这里需要自己在自己创建的`tdsql`中创建数据库 , 

}


def create_table(table_name, columns):
    # 建立MySQL数据库连接
    conn = pymysql.connect(**db_config)
    cursor = conn.cursor()
    # 组装创建表的 SQL 查询语句
    query = f"CREATE TABLE IF NOT EXISTS {
      
      table_name} ("
    for col_name, col_type in columns.items():
        query += f"{
      
      col_name} {
      
      col_type}, "
    query = query.rstrip(", ")  # 去除最后一个逗号和空格
    query += ")"

    # 执行创建表的操作
    cursor.execute(query)

    # 提交事务并关闭连接
    conn.commit()
    cursor.close()
    conn.close()


def excelTomysql():
    path = '词频'  # 文件所在文件夹
    files = [path + "/" + i for i in os.listdir(path)]  # 获取文件夹下的文件名,并拼接完整路径
    for file_path in files:
        print(file_path)
        filename = os.path.basename(file_path)
        table_name = os.path.splitext(filename)[0]  # 使用文件名作为表名,去除文件扩展名
        # 使用pandas库读取Excel文件
        data = pd.read_excel(file_path, engine="openpyxl", header=0)  # 假设第一行是列名
        columns = {
    
    col: "VARCHAR(255)" for col in data.columns}  # 动态生成列名和数据类型

        create_table(table_name, columns)  # 创建表
        save_to_mysql(data, table_name)  # 将数据保存到MySQL数据库中,并使用文件名作为表名
        print(filename + ' uploaded and saved to MySQL successfully')


def save_to_mysql(data, table_name):
    # 建立MySQL数据库连接
    conn = pymysql.connect(**db_config)
    cursor = conn.cursor()
    # 将数据写入MySQL表中(假设数据只有一个Sheet)
    for index, row in data.iterrows():
        query = f"INSERT INTO {
      
      table_name} ("
        for col_name in data.columns:
            query += f"{
      
      col_name}, "
        query = query.rstrip(", ")  # 去除最后一个逗号和空格
        query += ") VALUES ("
        values = tuple(row)
        query += ("%s, " * len(values)).rstrip(", ")  # 动态生成值的占位符
        query += ")"
        cursor.execute(query, values)

    # 提交事务并关闭连接
    conn.commit()
    cursor.close()
    conn.close()


def query_data():
    # 建立MySQL数据库连接
    conn = pymysql.connect(**db_config)
    cursor = conn.cursor()
    # 查询所有表名
    cursor.execute("SHOW TABLES")
    tables = cursor.fetchall()

    data = []
    dic_list = []
    table_name_list = []
    for table in tables:
        # for table in [tables[-1]]:
        table_name = table[0]
        table_name_list.append(table_name)
        query = f"SELECT * FROM {
      
      table_name}"
        # # 执行查询并获取结果
        cursor.execute(query)
        result = cursor.fetchall()
        if len(result) > 0:
            columns = [desc[0] for desc in cursor.description]
            table_data = [{
    
    columns[i]: row[i] for i in range(len(columns))} for row in result]
            data.extend(table_data)
        dic = {
    
    }
        for i in data:
            dic[i['word']] = float(i['count'])
        dic_list.append(dic)

    conn.commit()
    cursor.close()
    conn.close()
    return dic_list, table_name_list


if __name__ == '__main__':
    excelTomysql()
    result_list, table_name_list = query_data()
    for i in range(len(result_list)):
        maskImage = np.array(Image.open('background.PNG'))  # 定义词频背景图
        # 定义词云样式
        wc = wordcloud.WordCloud(
            font_path='PingFangBold.ttf', # 设置字体
            mask=maskImage,  # 设置背景图
            max_words=800,  # 最多显示词数
            max_font_size=200)  # 字号最大值
        # 生成词云图
        wc.generate_from_frequencies(result_list[i])  # 从字典生成词云
        # 保存图片到指定文件夹
        wc.to_file("词云图/{}.png".format(table_name_list[i]))
        print("生成的词云图【{}】已经保存成功!".format(table_name_list[i] + '.png'))
        plt.imshow(wc)  # 显示词云
        plt.axis('off')  # 关闭坐标轴
        plt.show()  # 显示图像


运行代码

效果如下 :

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

总结:

通过TDSQL-C for MySQL Serverless架构云数据库,可以体现云原生架构所带来的核心价值,如一些海量存储场景,存储数据、文件,并且性能也得到了很大的提升,如支持并行计算的能力,提升SQL性能,包括并行扫描,并行的多表连接、排序、分组、聚合等并行能力。
同时,在简单易用上面,也提供了很多参数模板,监控指标优化、备份和日志方面等可视化操作,极大降低了运维成本。

在这里插入图片描述

通过从0到1的了解与学习,TDSQL-C MySQL Serverless构建了一个产品全景能力图,并不仅仅是平时认知的数据库,通过控制台、客户端,通过凭证管理、审计能够进行一切监控,来给用户提供非常安全的访问环境。再通过参数的调优去辅助、协助用户更好的使用数据库,更优的使用数据库,让业务运行的更快,而不是将数据库不行的时候升配。再到整体架构,支持物理机、云服务器架构,支持异地的灾备,搭建符合公司企业级的业务需求,为公司带来降本提效。

猜你喜欢

转载自blog.csdn.net/ciflame/article/details/132556431