利用AI快速跨过新手区:用DevChat编写Python程序-CSV导入TDengine

还在用百度搜索编程吗? 直接上 AI,帮助小白快速跨过新手区。
以下用一个物联网最常见的场景做示例演示如何利用 AI 快速编程。

ChatGPT4 是目前最火的 AI 了,但是国内却用不了。不过现在新出的 DevChat 可以让大家尝鲜一番。

以下介绍来自Bing AI 聊天的介绍:

DevChat是一个开源平台,旨在帮助开发人员更有效地将人工智能集成到代码生成和文档编制中。它提供了一种非常实用和有效的方式,让开发人员与大型语言模型(LLM)进行交互和协作 。DevChat旨在超越简单的代码自动完成和对代码片段的有限操作,使您的编码生活更轻松 。

不是我懒,既然用 AI,就用到底。

目录

  • 0. 环境准备
    • 0.1. 创建数据库
    • 0.2. 构造测试数据
  • 1. 安装 DevChat
  • 2. 使用DevChat编程
    • 2.1. 从CSV读取数据到数组
    • 2.2. 将数组数据拼接成SQL
    • 2.3. 将数据写入数据库
    • 2.4. 程序修改
    • 2.5 运行代码
  • 3. 程序优化
  • 4. 福利

0. 环境准备

先做一下环境准备,本次准备编写一个将 CSV 文件导入 TDengine 数据库的程序。前期需要搭建 TDengine 数据库和构造示例 CSV 文件。

0.1. 创建数据库

TDengine 数据的安装和配置可以参考我之前的文章TDengine3.0 基础操作 和TDengine学习笔记-集群安装

软件安装好以后,创建测试用的数据库和表。

create database test vgroup 1 stt_trigger 1;
use test;
create table t1(ts timestamp,v1 int,v2 int,v3 int);

数据库参数的介绍见我之前的文章或TDengine官网,如果是测试使用,默认参数就可以,直接执行 create database test;

0.2. 构造测试数据

使用脚本,构造100行数据。按照 TDengine 的最佳实践,时间直接用EPOCH格式

st=1696118400000
for i in {1..100}
do
    echo "${st},$i,$i,$i" >>test.csv
    st=$(($st+1000))
done

数据库默认时间精度是 ms,所以这里采用毫秒精度,数据时间按秒递增。

1. 安装 DevChat

VSCode 大家都不陌生,DevChat 提供了 VSCode 插件,可以方便的集成。按照方式也非常简单,具体安装方式见官方博客:

DevChat VSCode 插件安装配置指南

官方文档很详细,这里就不截图了。

2. 使用DevChat编程

程序设计思路:

  1. 从csv读取数据到数组
  2. 将数组数据拼接成sql
  3. 将数据写入数据库

这部分工作还得自己来,AI 替代不了。

2.1. 从CSV读取数据到数组

关门放 DevChat

import csv

# 函数用于从csv文件读取数据并存储在数组中
def read_csv(file_path):
    data = []
    with open(file_path, 'r') as file:
        reader = csv.reader(file)
        for row in reader:
            data.append(row)
    return data

#替换为实际的csv文件路径
csv_data = read_csv("/path/to/your/file.csv")

点击 Insert Code 可以直接将代码添加到文件中,复制粘贴都省了。

2.2. 将数组数据拼接成SQL

这部分会复杂一点,因为 TDengine 最大 SQL 长度为 1MB,因此我们在拼接 SQL 时候,需要能够限制 SQL 的长度。

def create_sql_query(arr, chunk_size):
    sql_queries = []
    for i in range(0, len(arr), chunk_size):
        chunk = arr[i:i+chunk_size]
        values = ', '.join(f"'{item}'" for item in chunk)
        sql_query = f"INSERT INTO table (values) VALUES ({values})"
        sql_queries.append(sql_query)
    return sql_queries

同时我也对比了一下CSDN的写作助手。

代码如下:

sql = ""
for i in range(0, len(data), length):
    sub_data = data[i:i+length]
    sub_sql = "UPDATE table SET field IN ({})".format(",".join(sub_data))
    sql += sub_sql

print(sql)

实现逻辑一样,但是个人认为 DevChat 将 SQL 存入数组的实现方式更方便。

2.3. 将数据写入数据库

为了让代码更简单,也降低一下 DevChat 的工作量,这里采用 Restful 方式进行数据库的写入(原生方式太复杂,怕 DevChat 处理不了)。

import requests
import json

# 首先,我们需要通过RESTful方式登录到数据库
login_url = "http://localhost:6041/rest/login/root/taosdata"  # 使用你的用户名和密码
login_res = requests.get(login_url)
if login_res.status_code != 200:
    print("Failed to log in!")
else:
    print("Login to database successfully!")

# 接下来,我们插入一些数据
insert_url = "http://localhost:6041/rest/sql"
headers = {'Authorization': 'Basic cm9vdDp0YW9zZGF0YQ=='}
data = {
    "sql": "INSERT INTO weather.city VALUES(now, 'Beijing', 20.5, 'sunny')"
}

res = requests.post(insert_url, headers=headers, data=json.dumps(data))
if res.status_code != 200:
    print("Failed to insert data! Please check your SQL.")
else:
    print("Data inserted successfully!")

这部分需要给先 DevChat 点赞,代码在连接TDengine数据库使用了 Authorization 参数,比使用明文的账号密码要好很多,如果能够写出自定义 Token 的代码就更完美了。

2.4. 程序修改

AI 生成的程序必定和我们实际的场景存在偏差,获取到各功能块代码后,还需要做一下简单的修改。

import csv
import requests
import json

# 函数用于从csv文件读取数据并存储在数组中
def read_csv(file_path):
    data = []
    with open(file_path, 'r') as file:
        reader = csv.reader(file)
        for row in reader:
            data.append(row)
    return data

def create_sql_query(arr, chunk_size):
    sql_queries = []
    for i in range(0, len(arr), chunk_size):
        chunk = arr[i:i+chunk_size]
        values = ' '.join(f"({','.join(item)})" for item in chunk)
        sql_query = f"INSERT INTO test.t1 VALUES {values};"
        sql_queries.append(sql_query)
    return sql_queries

csv_data = read_csv("test.csv")

# 首先,我们需要通过RESTful方式登录到数据库
login_url = "http://10.7.7.14:6041/rest/login/root/taosdata"  # 使用你的用户名和密码
login_res = requests.get(login_url)
if login_res.status_code != 200:
    print("Failed to log in!")
else:
    print("Login to database successfully!")

insert_url = "http://10.7.7.14:6041/rest/sql"
headers = {'Authorization': 'Basic cm9vdDp0YW9zZGF0YQ=='}

sql_list = create_sql_query(csv_data,10)

for sql in sql_list:
    print(sql)
    res = requests.post(insert_url, headers=headers, data=sql)
    if res.status_code != 200:
        print("Failed to insert data! Please check your SQL.")
    else:
        print("Data inserted successfully!")

除了文件名称、数据库地址外,针对以上代码,我主要做了两部分修改:

  • 增加了一个数组的遍历。这部分也可以使用 DevChat 完成,只是代码太简单就不浪费计算资源了。
  • 修改了sql的拼接方式。DevChat 给出的代码拼接方式是有问题的,如下图。这样的 SQL 啥数据库也用不了,这部分要提出批评。

2.5 运行代码

终于到最重要的环节了,检查 AI 的时候到了。

程序运行成功,下面检查一下数据库

数据也全部写进去了。

3. 程序优化

DevChat 除了能帮助写程序,还能对程序进行排错有优化。选择Add to DevChat 将程序以附件形式发送给 DevChat,然后让其优化


优化后代码:

import csv
import requests
import json

def read_csv(file_path):
    with open(file_path, 'r') as file:
        return list(csv.reader(file))

def create_sql_query(arr, chunk_size):
    sql_queries = []
    for i in range(0, len(arr), chunk_size):
        chunk = arr[i:i+chunk_size]
        values = ', '.join(f"({','.join(item)})" for item in chunk)
        sql_query = f"INSERT INTO test.t1 VALUES {values}"
        sql_queries.append(sql_query)
    return sql_queries

def execute_sql_query(url, headers, sql_query):
    res = requests.post(url, headers=headers, data=sql_query)
    if res.status_code != 200:
        print("Failed to insert data! Please check your SQL.")
    else:
        print("Data inserted successfully!")

def login_to_db(url):
    res = requests.get(url)
    if res.status_code != 200:
        print("Failed to log in!")
    else:
        print("Login to database successfully!")
        return True

def main():
    csv_data = read_csv("test.csv")

    login_url = "http://10.7.7.14:6041/rest/login/root/taosdata"
    if not login_to_db(login_url):
        return

    insert_url = "http://10.7.7.14:6041/rest/sql"
    headers = {'Authorization': 'Basic cm9vdDp0YW9zZGF0YQ=='}

    sql_queries = create_sql_query(csv_data,10)

    for sql in sql_queries:
        execute_sql_query(insert_url, headers, sql)

if __name__ == "__main__":
    main()

4. 福利

目前 DevChat 可以免费试用,走过路过不要错过。

参赛成功的KOL会有专属红包兑换码,11月31日之前,粉丝可借助邀请码在Devchat兑换10元余额

红包码:CyqJYpDkAW2KMBGLiXywJW

DevChat 官方网站
GitHub

文章出处登录后可见!

已经登录?立即刷新

共计人评分,平均

到目前为止还没有投票!成为第一位评论此文章。

(0)
扎眼的阳光的头像扎眼的阳光普通用户
上一篇 2023年11月13日
下一篇 2023年11月13日

相关推荐