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

news/2024/5/20 9:06:43 标签: 腾讯云, serverless, TDSQL, python, 词云图

文章目录

  • 前言
  • 学到什么?
  • 准备工作
    • 申请TDSQL数据库
      • 1. 点击登录腾讯云
      • 2. 点击立即选购 ,如下图所示
      • 3. 选购页面中的数据库配置选项如下
      • 4. 基础信息
      • 5. 配置完成后点击 右下角的立即购买即可
      • 6. 点击立即购买后会有弹窗如下, 再次点击
      • 7. 购买完成后 , 会出现弹窗 , 点击`前往管理页面`
      • 8. 读写实例这里 点击`开启外部`
      • 9. 创建并授权即可
  • 数据准备
    • 创建项目工程
  • 链接 `TDSQL`
    • 创建数据库
    • 函数模块
      • 读取词频excel
        • 代码讲解
      • 创建表
        • 代码讲解
      • 保存数据到`tdsql`
        • 代码讲解
      • 读取`tdsql` 数据
        • 代码讲解
      • 代码调用
        • 代码讲解
      • 完整代码
      • 注意
  • 运行代码
  • 删除`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 版引擎。

本篇文章我们将一步一步的实现 使用 Python 向 TDSQL-C 添加读取数据 实现词云图

学到什么?

  1. 如何申请TDSQL数据库:包括登录腾讯云、选购配置、购买和管理页面等相关步骤。
  2. 创建项目工程、连接TDSQL数据库、创建数据库等内容。
  3. 涉及读取词频Excel、创建表、保存数据到TDSQL、读取TDSQL数据等相关代码的讲解。
  4. python 相关的知识等

准备工作

TDSQL_14">申请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_78">链接 TDSQL

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

在这里插入图片描述

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

}

创建数据库

  1. 如图点击登录按钮 , 登录到我们创建的数据库中
    在这里插入图片描述
  2. 进入数据库点击新建库
    在这里插入图片描述
  3. 点击新建数据库, 出现弹窗
    在这里插入图片描述
  4. 在弹窗中的 数据库名称中写入你喜欢的数据库名称即可 ,这里我们用的是 tdsql , 作为数据库名称 , 填写好数据库名称后,点击确定创建即可
    在这里插入图片描述
  5. 列表中出现我们创建的数据库名称后 , 就表示创建好了 , 我们就可以开始代码编写了哦!
    在这里插入图片描述

函数模块

读取词频excel

python">
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')


代码讲解

  1. 设置文件夹路径为’词频’,将该路径赋值给变量 path
  2. 使用os.listdir()函数获取文件夹下的所有文件名,并拼接完整路径,存储到列表 files 中。
  3. 使用 for 循环遍历 files 列表中的每个文件路径,并打印出文件路径。
  4. 使用 os.path.basename() 函数获取文件名,并将文件名赋值给变量 filename
  5. 使用 os.path.splitext() 函数获取文件名的扩展名,并通过索引操作去除扩展名部分,得到表名,并将表名赋值给变量 table_name
  6. 使用 pandas 库的 read_excel() 函数读取 Excel 文件,并将数据存储到变量 data 中。在读取过程中,使用 openpyxl 引擎,并假设第一行是列名。
  7. 使用字典推导式生成一个字典 columns,其中字典的键为数据的列名,值为 “VARCHAR(255)” 数据类型。
  8. 调用 create_table() 函数,以 table_namecolumns 作为参数,创建一个对应的表。
  9. 调用 save_to_mysql() 函数,以 datatable_name 作为参数,将数据保存到 MySQL 数据库中,并使用文件名作为表名。
  10. 打印出文件名加上 ’ uploaded and saved to MySQL successfully’ 的提示信息。

创建表

python">
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()
    

代码讲解

  1. 建立与MySQL数据库的连接,连接参数通过变量 db_config 提供。
  2. 创建一个光标对象 cursor,用于执行SQL语句。
  3. 组装创建表的SQL查询语句。首先,在SQL查询语句中插入表名 table_name。然后,通过 for 循环遍历 columns 字典中的每个键值对,分别将列名和数据类型添加到SQL查询语句中。
  4. 去除SQL查询语句末尾的最后一个逗号和空格。
  5. 添加右括号,完成SQL查询语句的组装。
  6. 使用光标对象 cursor 执行创建表的操作,执行的SQL语句为组装好的查询语句。
  7. 提交事务,将对数据库的修改持久化。
  8. 关闭光标和数据库连接。

代码中使用了 pymysql 模块来建立MySQL数据库连接,并通过编写SQL语句来执行创建表的操作。具体的数据库连接参数在 db_config 变量中提供,而 columns 参数则是由之前的代码生成的一个字典,包含了表的列名和数据类型。

保存数据到tdsql

python">
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()

代码讲解

  1. 建立与MySQL数据库的连接,连接参数通过变量 db_config 提供。
  2. 创建一个光标对象 cursor,用于执行SQL语句。
  3. 对于数据中的每一行,使用 for 循环迭代,获取索引和行数据。
  4. 组装插入数据的SQL查询语句。首先,在SQL查询语句中插入表名 table_name。然后,通过 for 循环遍历数据的列名,将列名添加到SQL查询语句中。
  5. 去除SQL查询语句末尾的最后一个逗号和空格。
  6. 添加右括号,完成SQL查询语句的组装。
  7. 使用 tuple(row) 将行数据转换为元组类型,并将值占位符 %s 动态生成相应数量的占位符。
  8. 将值的占位符添加到SQL查询语句中。
  9. 使用光标对象 cursor.execute() 执行SQL查询语句,将查询语句中的占位符替换为实际的行数据。
  10. 提交事务,将对数据库的修改持久化。
  11. 关闭光标和数据库连接。

读取tdsql 数据

python"> 
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

代码讲解

  1. 建立与MySQL数据库的连接,连接参数通过变量 db_config 提供。
  2. 创建一个光标对象 cursor,用于执行SQL语句。
  3. 使用 cursor.execute() 执行SQL查询语句 "SHOW TABLES",获取所有表名。
  4. 使用 cursor.fetchall() 获取查询结果,将结果存储在变量 tables 中。
  5. 创建空列表 datadic_listtable_name_list,用于存储查询结果的数据、字典和表名。
  6. 对于每个表名 table,通过 for 循环迭代,获取表名并添加到 table_name_list 中。
  7. 构建查询该表所有数据的SQL语句,并使用 cursor.execute() 执行该查询语句。
  8. 使用 cursor.fetchall() 获取查询结果,将结果存储在变量 result 中。
  9. 如果查询结果 result 的长度大于0,则说明有数据,进行以下操作:
    • 使用 cursor.description 获取查询结果的列名列表,并将列名存储在变量 columns 中。
    • 使用列表推导式和字典推导式,将查询结果的每一行转换为字典,并将字典存储在变量 table_data 中。
    • table_data 添加到 data 列表中。
  10. 根据 data 中的结果构建字典,并将字典存储在变量 dic 中。
  11. dic 添加到 dic_list 列表中。
  12. 提交事务,将对数据库的修改持久化。
  13. 关闭光标和数据库连接。
  14. 返回 dic_listtable_name_list

代码调用

python">
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()  # 显示图像

代码讲解

  1. 使用 Image.open() 打开名为 ‘background.PNG’ 的背景图,并将其转换为NumPy数组,存储在变量 maskImage 中,作为词云的背景图。
  2. 创建一个 WordCloud 对象 wc,设置字体路径、背景图、最多显示词数和字号最大值等参数。
  3. 使用 wc.generate_from_frequencies()result_list[i] 的字典数据生成词云图
  4. 使用 wc.to_file() 将生成的词云图保存为文件,文件名为 “词云图/{}.png”,其中 {} 表示对应的表名。
  5. 打印输出生成的词云图文件名。
  6. 使用 plt.imshow() 显示词云图
  7. 使用 plt.axis('off') 关闭坐标轴的显示。
  8. 使用 plt.show() 显示图像。

完整代码

python">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()  # 显示图像

注意

运行代码前 引入相关的包哦!

python">
pip install pymysql
pip install pandas
pip install wordcloud
pip install numpy
pip install pillow
pip install matplotlib

运行代码

写入截图

在这里插入图片描述

数据库数据截图

在这里插入图片描述

生成词云图

在这里插入图片描述

词云图存入到文件夹
在这里插入图片描述

TDSQL_482">删除TDSQL

体验完成, 考虑到当前这个业务没必要继续开启数据库了, 防止无效计费, 所以删除一下

如图点击销毁按钮

在这里插入图片描述
出现销毁实例的弹窗, 点击确定即可

在这里插入图片描述

资源下载

资源在百度盘里 自取哦 !

链接: https://pan.baidu.com/s/1hClOJI07HUuGBQ2SwZfWjw 提取码: 5mm9
–来自百度网盘超级会员v7的分享

总结

使用TDSQL 时你会发现, 真的是无缝接入, 非常的丝滑, 当然也有些不足,希望可以改进哦!!

优点

  1. 腾讯云数据库 TDSQL整体使用和感受还是很好的,操作比较简单,通过简单的官方文档就是搭建成功,其次性价比很高,尤其对于初学者新手 ,
  2. 与传统的数据库相比,TD-SQL Serverless的计费方式更为灵活,按照实际使用的资源进行付费,避免了长期运行服务器的成本。同时,它也可以在空闲时自动休眠,减少不必要的费用。

缺点

  1. 由于TD-SQL Serverless会在请求到达时才进行资源的分配和启动,因此在首次请求时可能会有一定的延迟。对于一些对实时性要求较高的应用场景,延迟可能会影响用户体验。
  2. 相比于传统的数据库,TD-SQL Serverless提供的配置和优化选项较少,用户对底层资源的控制能力有限。这可能会导致一些特定的需求无法满足。
  3. 虽然TD-SQL Serverless可以根据需求自动扩展计算资源,但高并发流量可能会导致较高的成本。如果在短时间内存在大量的并发请求,可能需要支付额外费用。

注意 这个三个缺点我只是根据经验进行猜想, 如有错误还请及时指正哦!!


http://www.niftyadmin.cn/n/4936972.html

相关文章

Scala中的Either的用法

在 Scala 中,Either 是一种表示两种可能值的数据类型。它可以用来处理函数可能返回的两种不同类型的结果,通常用于错误处理或者结果分支情况。Either 有两个子类:Left 和 Right,其中 Left 通常用于表示错误或异常情况,…

ESP8266(RTOS SDK)内嵌网页以实现WEB配网以及数据交互

【本文发布于https://blog.csdn.net/Stack_/article/details/131997098,未经允许不得转载,转载须注明出处】 1、执行make menuconfig,将http头由512改为更大的值,否则用电脑浏览器访问正常,但用手机浏览器访问会因为ht…

前端常用的上传下载文件的几种方式,直接上传、下载文件,读取.xlsx文件数据,导出.xlsx数据

一、通过调用接口下载文件 const onExport async () > {try {let res await axios.request({method: POST,url: 请求地址,responseType: blob,params: { data: null },headers: { Authorization: Bearer UserModule.token },//看看请求是否需要token});let reader new…

磁粉制动器离合器收放卷应用介绍

张力控制系统的开环闭环应用介绍,请查看下面文章链接: PLC张力控制(开环闭环算法分析)_张力控制plc程序实例_RXXW_Dor的博客-CSDN博客里工业控制张力控制无处不在,也衍生出很多张力控制专用控制器,磁粉制动器等,本篇博客主要讨论PLC的张力控制相关应用和算法,关于绕线…

Python jupyter lab 设置

在下载好jupyter lab 后,需要对其进行设置,尤其是远程服务器的时候,因为根本就是没有屏幕,也没有浏览器。 新建设置文件 jupyter lab --generate-config设置文件内部参数 vim ~/.jupyter/jupyter_lab_config.py进去一通改&#…

【Vue-Router】使用 prams 路由传参失效

报错信息: [Vue Router warn]: Discarded invalid param(s) “name”, “price”, “id” when navigating. list.json {"data": [{"name": "面","price":300,"id": 1},{"name": "水",&quo…

【力扣每日一题】2023.8.12 合并K个升序链表

目录 题目: 示例: 分析: 代码: 题目: 示例: 分析: 题目给我们一个链表数组,数组里的链表都是升序的,让我们合并这些链表,要求合并之后还是升序的。 最简…

Leetcode-每日一题【剑指 Offer 20. 表示数值的字符串】

题目 请实现一个函数用来判断字符串是否表示数值(包括整数和小数)。 数值(按顺序)可以分成以下几个部分: 若干空格一个 小数 或者 整数(可选)一个 e 或 E ,后面跟着一个 整数若干空…