9月7日,我有幸参加了腾讯全球数字生态大会中的“腾讯嘉年华”开发者活动。这场盛会不仅汇集了最前沿的技术分享,还设置了丰富的动手体验环节,让我们这些开发者能真正亲身感受到腾讯云产品的实际应用。对于像我这样的开发者而言,整个嘉年华最大的亮点之一,莫过于动手体验腾讯云的各种服务和工具,其中让我印象深刻的便是 TDSQL-C 云数据库。
在这里插入图片描述

下面我来聊聊自己最近亲身体验的腾讯云 TDSQL-C,作为一款云原生数据库,它给我带来了完全不同于传统数据库的使用感受。说实话,刚开始我对“云数据库”这种东西还挺陌生的,不过随着一步步实际操作下来,我发现它竟然简单到让小白都能轻松上手。

下面我就按照学习的顺序,把我整个动手过程分享给大家,不用担心技术门槛,因为这个过程真的是很简单!

1. 创建数据库实例

首先,要用腾讯云的 TDSQL-C,当然得先创建数据库实例。登录腾讯云之后,找到 TDSQL-C(MySQL 版本),整个创建过程就是点几下按钮,设置个数据库的名字、密码,选个字符集啥的,最后点“创建”就搞定了。
在这里插入图片描述

这个过程简化到了极致,系统会自动帮你搞定服务器和后台配置,完全不需要自己搭建什么复杂的环境,整个创建过程不到 5 分钟,简单又省心。

2. 用数据库管理工具连接

创建好数据库之后,我就用 MySQL Workbench 连接到这个数据库。连接方式和操作本地 MySQL 差不多,只要把腾讯云给的连接信息填进去就行。
在这里插入图片描述

一开始还担心云端数据库会不会操作延迟很大,但实际使用起来就像操作本地数据库一样,没有明显的卡顿感。

3. 创建表格和插入数据

连上数据库之后,接下来当然是建表和插入数据。我创建了一个 orders 表格,专门记录电商订单的数据,表结构挺简单,有订单号、商品名称、数量、价格之类的字段。接下来,用 SQL 语句插入了几百条测试数据。

CREATE TABLE `ecommerce_sales_stats` (
  `category_id` int NOT NULL COMMENT '分类ID(主键)',
  `category_name` varchar(100) NOT NULL COMMENT '分类名称',
  `total_sales` decimal(15,2) NOT NULL COMMENT '总销售额',
  `steam_sales` decimal(15,2) NOT NULL COMMENT 'Steam平台销售额',
  `offline_sales` decimal(15,2) NOT NULL COMMENT '线下实体销售额',
  `official_online_sales` decimal(15,2) NOT NULL COMMENT '官方在线销售额',
  PRIMARY KEY (`category_id`)
) ENGINE=INNODB DEFAULT CHARSET=utf8mb4 AUTO_INCREMENT=1 COMMENT='电商分类销售统计表';

CREATE TABLE `users` (
  `user_id` int NOT NULL AUTO_INCREMENT COMMENT '用户ID(主键,自增)',
  `full_name` varchar(100) NOT NULL COMMENT '用户全名',
  `username` varchar(50) NOT NULL COMMENT '用户名',
  `email` varchar(100) NOT NULL COMMENT '用户邮箱',
  `password_hash` varchar(255) NOT NULL COMMENT '用户密码的哈希值',
  `created_at` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
  `updated_at` datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
  `is_active` tinyint(1) DEFAULT '1' COMMENT '是否激活',
  PRIMARY KEY (`user_id`),
  UNIQUE KEY `email` (`email`)
) ENGINE=INNODB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4  COMMENT='用户表';
I
CREATE TABLE `orders` (
  `order_id` int NOT NULL AUTO_INCREMENT,
  `user_id` int DEFAULT NULL,
  `order_amount` decimal(10,2) DEFAULT NULL,
  `order_status` varchar(20) DEFAULT NULL,
  `order_time` datetime DEFAULT NULL,
  PRIMARY KEY (`order_id`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4 ;

整个插入数据的过程非常流畅,和我以前用 MySQL 的体验几乎没差别。数据库还支持批量插入操作,处理效率相当高,几秒钟就把几百条数据都插进去了。

4. 体验 TDSQL-C 的 Serverless 特性

TDSQL-C 最大的亮点之一就是它的 Serverless 特性,这意味着你不用为服务器的资源分配操心。一般来说,传统的数据库需要根据业务量预估服务器资源,否则会因为超载而崩溃。但有了 Serverless,TDSQL-C 会自动根据负载调节资源,该扩容扩容,该缩容缩容,特别省心。

比如,我特意模拟了数据库的高负载状态,连续执行多个大查询。TDSQL-C 表现得相当稳,数据库会根据查询压力自动调整资源,完全不用人为干预。

5. 数据查询与分析

最后, 用Python 代码,结合 SQL 查询数据库里的订单数据,做了简单的销售额统计。通过 Python 调用 MySQL Connector 连接 TDSQL-C,体验跟本地 MySQL 没有任何差异,查询速度也很快。

from langchain_community.utilities import SQLDatabase
from langchain_core.prompts import ChatPromptTemplate
from langchain_community.chat_models import ChatOllama
from langchain_core.output_parsers import StrOutputParser
from langchain_core.runnables import RunnablePassthrough
import yaml
import mysql.connector
from decimal import Decimal
import plotly.graph_objects as go
import plotly
import pkg_resources
import matplotlib

yaml_file_path = 'config.yaml'

with open(yaml_file_path, 'r') as file:
    config_data = yaml.safe_load(file)

#获取所有的已安装的pip包
def get_piplist(p):
    return [d.project_name for d in pkg_resources.working_set]


#获取llm用于提供AI交互
ollama = ChatOllama(model=config_data['hai']['model'],base_url=config_data['hai']['base_url'])

db_user = config_data['database']['db_user']
db_password = config_data['database']['db_password']
db_host = config_data['database']['db_host']
db_port= config_data['database']['db_port']
db_name = config_data['database']['db_name']
# 获得schema
def get_schema(db):
    
    schema = mysql_db.get_table_info()
    return schema
def getResult(content):
    global mysql_db
    # 数据库连接
    mysql_db = SQLDatabase.from_uri(f"mysql+mysqlconnector://{db_user}:{db_password}@{db_host}:{db_port}/{db_name}")
    # 获得 数据库中表的信息
    #mysql_db_schema = mysql_db.get_table_info()
    #print(mysql_db_schema)
    template = """基于下面提供的数据库schema, 根据用户提供的要求编写sql查询语句,要求尽量使用最优sql,每次查询都是独立的问题,不要收到其他查询的干扰:
    {schema}
    Question: {question}
    只返回sql语句,不要任何其他多余的字符,例如markdown的格式字符等:
    如果有异常抛出不要显示出来
    """
    prompt = ChatPromptTemplate.from_template(template)
    text_2_sql_chain = (
                RunnablePassthrough.assign(schema=get_schema)
                | prompt
                | ollama
                | StrOutputParser()
        )
    
    # 执行langchain 获取操作的sql语句
    sql = text_2_sql_chain.invoke({"question": content})

    print(sql)
    #连接数据库进行数据的获取
    # 配置连接信息
    conn = mysql.connector.connect(
    
        host=db_host,
        port=db_port,
        user=db_user,
        password=db_password,
        database=db_name
    )
    # 创建游标对象
    cursor = conn.cursor()
    # 查询数据
    cursor.execute(sql.strip("```").strip("```sql"))
    info = cursor.fetchall()
    # 打印结果
    #for row in info:
        #print(row)
    # 关闭游标和数据库连接
    cursor.close()
    conn.close()
    #根据数据生成对应的图表
    print(info)
    template2 = """
    以下提供当前python环境已经安装的pip包集合:
    {installed_packages};
    请根据data提供的信息,生成是一个适合展示数据的plotly的图表的可执行代码,要求如下:
        1.不要导入没有安装的pip包代码
        2.如果存在多个数据类别,尽量使用柱状图,循环生成时图表中对不同数据请使用不同颜色区分,
        3.图表要生成图片格式,保存在当前文件夹下即可,名称固定为:图表.png,
        4.我需要您生成的代码是没有 Markdown 标记的,纯粹的编程语言代码。
        5.生成的代码请注意将所有依赖包提前导入, 
        6.不要使用iplot等需要特定环境的代码
        7.请注意数据之间是否可以转换,使用正确的代码
        8.不需要生成注释
    data:{data}

    这是查询的sql语句与文本:

    sql:{sql}
    question:{question}
    返回数据要求:
    仅仅返回python代码,不要有额外的字符
    """
    prompt2 = ChatPromptTemplate.from_template(template2)
    data_2_code_chain = (
                RunnablePassthrough.assign(installed_packages=get_piplist)
                | prompt2
                | ollama
                | StrOutputParser()
        )
    
    # 执行langchain 获取操作的sql语句
    code = data_2_code_chain.invoke({"data": info,"sql":sql,'question':content})
    
    #删除数据两端可能存在的markdown格式
    print(code.strip("```").strip("```python"))
    exec(code.strip("```").strip("```python"))
    return {"code":code,"SQL":sql,"Query":info}


# 构建展示页面
import streamlit
# 设置页面标题
streamlit.title('AI驱动的数据库TDSQL-C 电商可视化分析小助手')
# 设置对话框
content = streamlit.text_area('请输入想查询的信息', value='', max_chars=None)
# 提问按钮 # 设置点击操作
if streamlit.button('提问'):
    #开始ai及langchain操作
    if content:
        #进行结果获取
        result = getResult(content)
        #显示操作结果
        streamlit.write('AI生成的SQL语句:')
        streamlit.write(result['SQL'])
        streamlit.write('SQL语句的查询结果:')
        streamlit.write(result['Query'])
        streamlit.write('plotly图表代码:')
        streamlit.write(result['code'])
        # 显示图表内容(生成在getResult中)
    streamlit.image('./图表.png', width=800) 

而且,TDSQL-C 的弹性扩展在这种数据分析任务中表现得非常好,处理大数据集也游刃有余。特别是当多用户同时访问时,数据库依然能保持很好的响应速度,这对业务量大的企业来说应该是个不错的选择。

总结:TDSQL-C 值得一试

整个学习过程让我感受最深的就是 TDSQL-C 的“傻瓜式”操作,省去了很多传统数据库的管理麻烦,特别适合那些不想自己维护服务器的开发者。

  • 操作简单:不用担心搭建环境,创建数据库和插入数据都特别方便。
    Serverless 省心:按需扩展资源,业务高峰也不用担心数据库崩溃。
  • 性能稳定:不管是插入数据还是查询分析,响应速度都很快。

总之,TDSQL-C 非常适合那些需要快速上手、追求省心管理的开发者。如果你和我一样,不想操心服务器配置和维护,那它绝对是个值得试试的选择!

Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐