烯八 发表于 2025-12-31 16:50:04

cursor cli 执行 ETL 数据同步任务探索

背景

今年接到不少有关数据同步的需求,其中一个需求,需要将10多张 mysql 表每天定时导入到 starrocks,于是顺带写了一个小工具实现了快速批量同步表的功能,手敲指令的工作变少了。不过前期测试这个工具的时候,还是没少在命令行和 vscode 之间反复折腾
刚好公司最近采购了一些 cursor 账号,再加上了解到 cursor 有 cli 命令行模式之后,就想到这个需求,假如我不依赖其他代码和工具,能让 cursor 直接完成整个数据同步需求吗?
那么本文就是从这样,从一个简化版的需求入手,但尝试把过程做得完善的 cursor cli 使用方式探索
在正式开始任务之前,我们需要先简单了解一下什么是 ETL,以及 cursor cli 怎么安装
ETL

ETL 可能是很多人接触大数据,第一个了解到的概念。它的确是在大数据种类繁杂的任务中,执行时间放在第一位的。ETL 负责把业务的原始数据按照一定的过滤规则和约定格式进行清洗和转换,再通过工具和数据库接口,导入到大数据体系的数据仓库中
https://img2024.cnblogs.com/blog/1267801/202512/1267801-20251231153157406-1277048957.png
E: Extract, 从源表提取数据,在这里你可以做数据筛选
T: Translate, 数据在导入数仓之前,进行的数据内容和格式的转换,比如一个 json 格式的字符串字段,业务只需要其中的一个键值,就会在这个阶段进行提取
L: Load, 数据最终写入到数仓的过程
下图是 ETL 过程对应到现实中需要怎么做的4步曲
https://img2024.cnblogs.com/blog/1267801/202512/1267801-20251231153203191-1926557205.png
cursor cli

AI 时代最流行的就是 AI 辅助编程,如下图,在 cursor IDE 中直接提出需求让 AI 帮我们把基本的代码写好
https://img2024.cnblogs.com/blog/1267801/202512/1267801-20251231153648197-1056505032.png
当然 IDE 并不是这期的主角,而是 cursor cli ,它是 cursor 的命令行运行模式,可以直接在终端中给 cursor 发送指令,去生成代码、修改代码、与操作系统进行交互、使用 mcp 等,无需功能比较复杂的 IDE,保持最纯净的和 AI 之间对话的方式
https://img2024.cnblogs.com/blog/1267801/202512/1267801-20251231153226815-589139598.png
这种模式非常适合执行有明确预期的任务。比如在 DevOps 流水线单测过程中修改 bug,在镜像制作过程中安装特定组件,以及接下来的数据完整同步的任务等
cursor cli 的安装非常简单,执行官方安装脚本即可
# 安装curl https://cursor.com/install -fsS | bash# 首次登录# 注: 这个指令打印的链接不需要当前系统支持弹出浏览器,把链接复制到外部浏览器打开也可以~/.local/bin/cursor-agent login# 开启上一个会话~/.local/bin/cursor-agent --resume=会话id,在退出时会显示https://img2024.cnblogs.com/blog/1267801/202512/1267801-20251231153239993-609881985.png
恢复上一次会话:
https://img2024.cnblogs.com/blog/1267801/202512/1267801-20251231153244147-45989702.png
其他常用指令
# 查看登录状态~/.local/bin/cursor-agent status# 退出登录~/.local/bin/cursor-agent logout# 查看本地支持的 mcp 列表~/.local/bin/cursor-agent mcp list# 使用特定模型# 目前支持模型: composer-1, auto, sonnet-4.5, sonnet-4.5-thinking, opus-4.5, opus-4.5-thinking, gemini-3-pro, gemini-3-flash, gpt-5.2, gpt-5.1, gpt-5.2-high, gpt-5.1-high, gpt-5.1-codex, gpt-5.1-codex-high, gpt-5.1-codex-max, gpt-5.1-codex-max-high, opus-4.1, grok# --model: 设置模型名# -p: print 输出结果之后结束会话# --output-format: 设置输出格式: text / json~/.local/bin/cursor-agent --model "gpt-5.2" -p "查找当前项目的问题并修复" --workspace /opt/coding/go_common --output-format text这里我没有切换模型,使用的是 cursor 默认的模型 composer-1,后续我测试了 gpt-5 ,效果和默认模型差不多
cursor 价格: 有14天的免费适用, 对普通用户来说 Pro 套餐足够了,一个月100多元
https://img2024.cnblogs.com/blog/1267801/202512/1267801-20251231153250265-813070636.png
整体任务设计思路

遵循着尽量让过程更完善的思路,我们希望让 cursor 做更多的事情,因此整体任务的设计包括 DataX 安装、数据库安装和 ETL 数据同步三个部分
一点点的准备工作也还是需要的,在自己电脑我们可以通过 docker 启动一个 centos8 或者 ubuntu24 的容器,或者公司有给你提供一个纯净的测试虚拟机也可以

[*]注: 不能用 centos7 因为内核版本较低,不支持运行 cursor cli 中的一些 nodejs 库,至少需要 centos8
通过 cursor 辅助我们,任务流程变成了下图:
https://img2024.cnblogs.com/blog/1267801/202512/1267801-20251231153255927-799798039.png
过程

step 1: 安装 DataX

DataX 是阿里开源的跨数据库批量数据同步工具,它不涉及服务端,所以它的安装过程是比较简单的,我们先把它安装好
help me install datax at /opt/modules, including basic environment一些关键日志:
# 分析安装 datax 详细步骤⬢ To-do Working on 5 to-dos☐ 创建 /opt/modules 目录☐ 安装 Java 环境(JDK 1.8+)☐ 下载 DataX 安装包☐ 解压并配置 DataX☐ 配置环境变量# 安装目录、下载命令行工具检查$ ls -la /opt/modules 2>/dev/null || echo "Directory does not exist" 77stotal 0drwxr-xr-x 13 root    root    173 Nov 21 23:50 .… truncated (13 more lines) · ctrl+o to expand$ which wget curl 2>/dev/null || echo "Need to check download tools" 77s/usr/bin/wget/usr/bin/curl… truncated (1 more line) · ctrl+o to expand# 检查 java 是否安装Checking Java installation (required for datax), then downloading and installing datax.$ java -version 2>&1 | head -1 12sopenjdk version "1.8.0_432"# 下载 datax$ cd /tmp && wget --no-check-certificate -O datax.tar.gz"https://datax-opensource.oss-cn-hangzhou.aliyuncs.com/202309/datax.tar.gz" 2>&1 | tail -5 183s1639950K .......... .......... .......... .......... .......... 99% 8.75M 0s1640000K .......... .......... ...                           100% 11.0M=2m38s… truncated (4 more lines) · ctrl+o to expand# 校验安装是否成功$ ls -lh /opt/modules/datax/job/ 2>&1 | head -10 6.2s    total 4.0K    -rw-r--r-- 1 1001 1001 1.6K Aug 23 13:03 job.json    … truncated (1 more line) · ctrl+o to expandhttps://img2024.cnblogs.com/blog/1267801/202512/1267801-20251231153244147-45989702.png
从日志可以看出 cursor 在安装组件任务上,步骤比较“严谨”的特点:

[*]执行任务之前,它会详细列出具体每一步会做什么,包括完整的准备、安装和检查,很清晰和标准
[*]在加上了需要安装基础环境的 prompt 说明之后,运行 DataX 需要的 python 和 JDK 它都会装好
也有一些小瑕疵:

[*]在 DataX 已经安装的情况下,再次发送相同的 prompt,还是要30s左右跑完
因为它需要在系统执行 ls 、python bin/datax.py等指令,先将指令的返回传给 cursor 的后台服务器,再等待服务端的判断结果,大部分耗时可能都在接口调用上了
[*]DataX 的官方下载地址 datax-opensource.oss-cn-hangzhou.aliyuncs.com 提供的其实不是最新的版本,它的更新日期只到 202308,但官方仓库在那之后还是有少量更新,想用最新版本应该直接编译源码
安装 mysql

第二步是安装 mysql,这里我顺便尝试让 cursor 把 root 密码和数据存储路径也修改一下
help me install mysql at /opt/modules/mysql, start at 3306 port and set default root user password to Root@888 and set data dir to /opt/data/mysql一些关键日志:
# 分析详细步骤⬢ To-do Working on 7 to-dos☐ 检查系统环境和现有 MySQL☐ 创建安装目录和数据目录☐ 下载并安装 MySQL☐ 配置 MySQL(端口、数据目录)☐ 初始化 MySQL 数据库☐ 设置 root 密码为 Root@888☐ 启动 MySQL 服务并配置开机自启# 下载 mysql 官方 linux 安装包$ cd /opt/modules && wget https://dev.mysql.com/get/Downloads/MySQL-8.0/mysql-8.0.37-linux-glibc2.12-x86_64.tar.xz -O mysql.tar.xz2>&1 | tail -15 35s# 基本配置etc/my.cnf +27+ + # 基本配置+ port = 3306+ datadir = /opt/data/mysql+ socket = /tmp/mysql.sock+ pid-file = /opt/data/mysql/mysql.pid+ # 字符集+ character-set-server = utf8mb4+ collation-server = utf8mb4_unicode_ci+# 解决依赖库缺少的问题$ yum install -y libaio numactl-libs 2>&1 | tail -20 66s(2/2): numactl-libs-2.0.12-13.el8.x86_64.rpm    161 kB/s |36 kB   00:00    --------------------------------------------------------------------------------… truncated (19 more lines) · ctrl+o to expand# 初始化 mysql 并设置密码$ /opt/modules/mysql/bin/mysqld --initialize-insecure --user=mysql --datadir=/opt/data/mysql --basedir=/opt/modules/mysql 2>&1 | tail -5 14s$ su - mysql -s /bin/bash -c "/opt/modules/mysql/bin/mysqld_safe --defaults-file=/etc/my.cnf --user=mysql --datadir=/opt/data/mysql--basedir=/opt/modules/mysql > /dev/null 2>&1 &" && sleep 5 16s# 完成安装mysql -u root -pRoot@888安装完成后查看进程:
https://img2024.cnblogs.com/blog/1267801/202512/1267801-20251231153310749-1854678777.png
安装 mysql 是所有阶段中做得最好的一步:

[*]首先是版本,选择的 8.0.37 是去年5月的版本,对 mysql 而言还是比较新的
[*]系统中诸如 libaio 、libnuma、ncurses 等依赖库缺少的问题,它都能解决
[*]设置 root 密码需要先启动 mysql 初始化之后再设置,这个步骤也是完全正确
[*]/etc/my.cnf 中还设置了和慢查询、字符集、最大连接数等在生产环境常用的优化配置
安装 starrocks

接着我们安装大数据体系中的实时数仓服务 starrocks。starrocks 的安装就明显比前面两个安装要复杂一些了,所以在 prompt 中我们也需要写得更详细
help me to install starrocks at /opt/modules/starrocks, following the steps1. download starrocks version 3.3.20 from https://releases.starrocks.io/starrocks/StarRocks-3.3.20-centos-amd64.tar.gz2. install to /opt/modules3. set fe mysql port set to 190304. default root user password to Root@Star6665. register be to fe, be ip use local ipv4 ip and port use 90506. start fe and be# 注: 如果你是用 ubuntu 系统,需要把下载地址改成 https://releases.starrocks.io/starrocks/StarRocks-3.3.20-ubuntu-amd64.tar.gz一些关键日志:
# 分析安装步骤⬢ To-do Working on 7 to-dos☐ 下载 StarRocks 3.3.20 版本☐ 解压并安装到 /opt/modules/starrocks☐ 配置 FE (MySQL 端口 19030, root 密码 Root@Star666)☐ 配置 BE (端口 9050)☐ 启动 FE 并初始化☐ 注册 BE 到 FE☐ 启动 BE 并验证# 设置 fe 的配置│ opt/modules/starrocks/fe/conf/fe.conf +1 -1││   http_port = 8030│   rpc_port = 9020│ - query_port = 9030│ + query_port = 19030│   edit_log_port = 9010# 设置 root 密码并注册 be$ mysql -h 127.0.0.1 -P 19030 -uroot -e "ALTER USER 'root'@'%' IDENTIFIED BY 'Root@Star666';" 2>&1 | grep -v Warning exit 1 • 7.4s$ BE_IP=$(hostname -I | awk '{print $1}') && BE_PORT=9050 && echo "注册 BE: ${BE_IP}:${BE_PORT}" && mysql -h127.0.0.1 -P19030 -uroot-pRoot@Star666 -e "ALTER SYSTEM ADD BACKEND '${BE_IP}:${BE_PORT}';" 2>&1 | grep -v Warning exit 1 • 5.6s$ sleep 15 && mysql -h 127.0.0.1 -P 19030 -uroot -pRoot@Star666 -e "SHOW BACKENDS\G" 2>&1 | grep -E"(Host|Port|Alive|SystemDecommissioned)" | head -8 21s          HeartbeatPort: 9060                  BePort: -1# 完成安装mysql -h127.0.0.1 -P19030 -uroot -pRoot@Star666安装完成后的进程,以及查看 be 注册情况:
https://img2024.cnblogs.com/blog/1267801/202512/1267801-20251231153316613-1805767681.png
体会:

[*]第一次安装时,我故意没有告诉它安装包下载地址,它先尝试从官方下载 3.1.8 的版本,但可能是这个版本比较早了,从官方下载返回文件不存在。然后它就继续尝试从 apache repo 去下载,但是这一步就明显错误了,starrocks 项目并不在 apache 组织下
所以这才有了上面的 prompt,我需要把确定能下载到安装包的版本号告诉它才行
[*]starrocks 的主要服务包括负责处理查询请求的 fe 和 负责数据存储的 be,完整安装也包括这两个组件的启动、注册和状态检查,因此 cursor 在安装时的过程比较复杂,时间也更长
[*]be 注册时,fe 会检查注册指令传入的 be ip 和 be 上报的节点的 ipv4 ip 是否一致,若不一致会报 FE saved address not match backend address,所以在 be 的注册指令 add backend 必须用本机的 ipv4 ip 去注册。但关于这点 cursor 是不知道的,它会用 127.0.0.1 去注册,导致 be 无法激活和写入数据。因此这个细节也需要在 prompt 中说明
[*]在 mysql 的配置文件 my.cnf 可以看到一些生产级别的优化,但是 starrocks 的 fe 和 be 配置中就没有了
mysql 中插入模拟电商场景的数据

如果你想测试一个数据库支持的函数、查询性能等,先把数据制造出来,写到数据库中,往往是重要的第一步。常见的造数据方法有两个: 通过脚本或工具生成纯随机的文本、数字等,比如 flink 的 datagen 或者 seatunnel 的 FakeSource;第二种是直接使用一些网站提供的数据集,比如 kaggle 这里提供了比较真实的 csv 格式数据,你可以用脚本导入到数据库中再进行测试
https://img2024.cnblogs.com/blog/1267801/202512/1267801-20251231153326052-1468453971.png
当然,既然我们已经用了 cursor,就干脆让它直接造数据试试吧
insert some fake selling data to local mysql, table design:- seller- good- customer- orderinsert to seller table 100w rows, good table 10w rows, customer table 10w rows, order table 1000w# 注: 若你一直在同一个会话中,就无需再说明 mysql 访问地址和密码local mysql password is Root@888, connect sock file is /opt/modules/mysql/run/mysql.sock/opt/modules/mysql/bin/mysql --socket=/opt/modules/mysql/run/mysql.sock -uroot -pRoot@888 -e "show databases"关键日志
# 设计过程⬢ To-do Working on 3 to-do☐ 设计数据库表结构(seller, good, customer, order)☐ 创建Python脚本生成假数据并插入MySQL☐ 测试连接并执行数据插入# 执行数据导入脚本$ chmod +x /insert_fake_data.py 7.6s$ cd / && python3 insert_fake_data.py 2>&1 | head -30 0ms# 打印生成好的数据信息1. 创建数据库和表结构:• 数据库:test_db• 4 个表:seller、good、customer、order2. 插入数据:• seller 表:1,000,000 行(100万)• good 表:100,000 行(10万)• customer 表:100,000 行(10万)• order 表:10,000,000 行(1000万)数据特点:• seller(卖家):包含中国30个主要城市,随机注册日期和销售额• good(商品):10个类别(电子产品、服装、食品等),10个品牌• customer(客户):包含VIP等级分布,随机注册信息• order(订单):时间跨度约5年,包含完整的订单信息(价格、折扣、支付方式等)数据统计:• 总数据量:约 11,200,000 行• 数据库大小:约 4.5 GB(包含索引)可以发现,生成数据和导入数据库这种过程较多的操作,cursor 就会开始写成脚本来执行了
来看 insert_fake_data.py 中的部分逻辑
def create_tables(connection):    cursor.execute("""      CREATE TABLE IF NOT EXISTS `order` (            id BIGINT AUTO_INCREMENT PRIMARY KEY,            order_no VARCHAR(50) UNIQUE NOT NULL,            ...            status TINYINT DEFAULT 0 COMMENT '0:待支付, 1:已支付, 2:已发货, 3:已完成, 4:已取消',            order_time DATETIME NOT NULL,            created_at DATETIME DEFAULT CURRENT_TIMESTAMP,            INDEX idx_order_no (order_no),            ...      ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4    """)# fake.word: 通过枚举生成随机的字符串(商品名称)def insert_goods(connection, count=100000, seller_count=1000000):for i in range(batch_start, batch_end):      values.append((          fake.word() + ' ' + fake.word(),# 商品名称          fake.text(max_nb_chars=200),# 描述          round(random.uniform(10, 10000), 2),# 价格          random.choice(categories),# 类别          random.randint(0, 10000),# 库存          random.randint(1, seller_count),# 卖家ID          fake.date_time_between(start_date='-3y', end_date='now')      ))查看 cursor 造出来的数据:
https://img2024.cnblogs.com/blog/1267801/202512/1267801-20251231153343483-861134382.png
https://img2024.cnblogs.com/blog/1267801/202512/1267801-20251231153345605-1747746938.png
体会:

[*]cursor 把生成随机数、通过 pymysql 写入数据等具有一定重复性的操作,都封装成 python 方法了,insert 还做了分批,加快写入速度。基本的优化工作做得挺好
[*]创建的表结构,以及数据,合理性还是不错的,并不是完全随机。像价格它会定一个范围,商品类型也有枚举9种等
将数据从 mysql 导入 DataX

最后一步,通过 DataX 把 mysql 中的数据导入到 starrocks
help me sync all tables in test_db from local mysql to local starrocks by DataXsteps:1、set mysql root user can access by 127.0.0.12、sync all tables in mysql test_db to starrocks test_db# 同理,同一个会话中无需再次声明数据库连接配置local mysql:mysql -h127.0.0.1 -P3306 -uroot -pRoot@888local starrocks:mysql -h127.0.0.1 -P19030 -uroot -pRoot@Star666关键日志:
# 设计步骤⬢ To-do Working on 5 to-dos☐ 设置MySQL root用户可以通过127.0.0.1访问☐ 检查DataX安装情况☐ 创建DataX配置文件模板☐ 创建同步脚本,自动生成所有表的DataX配置☐ 执行数据同步# 检查 datax 的 writer 插件中是否支持 starrocks$ ls -la /opt/modules/DataX/plugin/writer/ 2>/dev/null | head -20 7.8stotal 4drwxrwxr-x 41 1001 1001 4096 Aug 23 21:03 .… truncated (19 more lines) · ctrl+o to expand# 创建批量同步脚本,自动为所有表生成 DataX 配置并执行同步:$ cd / && python3 sync_mysql_to_starrocks.py 2>&1 | tee /tmp/sync_log.txt 7.6sTraceback (most recent call last):    File "sync_mysql_to_starrocks.py", line 149, in create_starrocks_table… truncated (114 more lines) · ctrl+o to expand$ cd /opt/modules/DataX && python3 bin/DataX.py /tmp/DataX_customer.json 2>&1 | head -50 exit 1 • 9.6sDataX (DATAX-OPENSOURCE-3.0), From Alibaba !… truncated (49 more lines) · ctrl+o to expand阅读 sync_mysql_to_starrocks.py 脚本的大致逻辑:

[*]create_starrocks_table: 在 starrocks 创建和 mysql 库表名、表结构一致的表
[*]convert_mysql_type_to_starrocks: 将 mysql 字段类型转换为 starrocks 类型,这里对 mysql 的 BINARY、TEXT 和 BLOB 等字符串类型都转成了 STRING, 也是合理的转换
[*]generate_datax_config: 生成 DataX 任务配置文件
[*]sync_table: 通过 subprocess.Popen 执行 DataX 脚本
创建的 DataX 配置文件示例: /tmp/DataX_good.json
https://img2024.cnblogs.com/blog/1267801/202512/1267801-20251231153353504-731375360.png
https://img2024.cnblogs.com/blog/1267801/202512/1267801-20251231153355194-929916417.png
大概花了半个多小时完成了4张表的同步,从 starrocks 简单确认一下数据:
mysql -h127.0.0.1 -P19030 -uroot -pRoot@Star666 -e "select * from test_db.`order` limit 10"
https://img2024.cnblogs.com/blog/1267801/202512/1267801-20251231153400757-2074130601.png
体会:

[*]到了数据同步这个最关键的一步,就明显感觉到 AI 还是有一些场景是需要人去辅助它的,一次性做对这件事情还是有点难度
[*]mysql 默认情况下 root 用户必须通过 sock 文件访问,但 DataX 访问 mysql 是通过 jdbc 去连接的,所以 mysql 的连接权限需要先加好
[*]DataX 同步 mysql 数据时,mysql source column 配置中是要写上列名或者 "*" 的,但是 cursor 第一次生成的配置文件没有加这个配置,导致同步错误
不过 cursor 在通过错误信息发现这个问题后,及时修改了脚本解决
[*]mysql source 中的 querySql 配置可以简化成 selectedDatabase 和 table
[*]mysql 的字段和 starrocks 字段类型之间,有的并不是完全一致的对应,会有特殊规则,比如字符串的长度,mysql 用的是字符长度,而 starrocks 用的是字节,长度是 mysql 的 3 倍
扩展: 将 datax 任务执行过程封装成脚本

回到文章最开始说的数据同步需求,对我来说重复的工作就在前面所说的最后一步:生成 datax 配置并执行。那么能不能让 cursor 直接写好脚本,可以反复去做每张数据表的同步呢?
答案当然是可以的
help me write scripts using python, support sync specify mysql table to starrocks using dataxscript param: table full name (db.table)please check script can run by sync test_db.seller and fix sync errorsmysql connect: mysql -h127.0.0.1 -P3306 -uroot -pRoot@888starrocks connect: mysql -h127.0.0.1 -P19030 -uroot -pRoot@Star666https://img2024.cnblogs.com/blog/1267801/202512/1267801-20251231153413129-1740905910.png
脚本部分关键逻辑和同步测试:
# /root/datax_sync/mysql_to_starrocks.pyclass MySQLToStarRocksSync:    def __init__(self, table_name, mysql_config=None, starrocks_config=None):      self.table_name = table_name      if '.' not in table_name:            raise ValueError("表名格式错误,应为 db.table 格式")                self.db_name, self.table_name_only = table_name.split('.', 1)                # json 格式表示 mysql 连接配置      self.mysql_config = mysql_config or {            "host": "127.0.0.1",            "port": 3306,            "username": "root",            "password": "Root@888"      }    def generate_datax_config(self):      # 数据库连接、同步的库表名字等关键配置由脚本参数传递      config = {            ...                "content": [                  {                        "reader": {                            "name": "mysqlreader",                            "parameter": {                              "username": self.mysql_config["username"],                              "password": self.mysql_config["password"],                              "column": ["*"],                              "connection": [                                    {                                        "table": ,                                        "jdbcUrl": [                                          f"jdbc:mysql://{self.mysql_config['host']}:{self.mysql_config['port']}/{self.db_name}?useUnicode=true&characterEncoding=utf8&useSSL=false&serverTimezone=Asia/Shanghai"                                        ]                                    }                              ]                            }                        },      ...   # 通过 subprocess 运行 datax 指令    def sync(self):            print(f"正在生成DataX配置...")            config = self.generate_datax_config()                        config_file = self.save_config_file(config)            process = subprocess.Popen(                cmd,                stdout=subprocess.PIPE,                stderr=subprocess.PIPE,                universal_newlines=True            )            stdout, stderr = process.communicate()            result = Result(process.returncode, stdout, stderr)def main():    parser = argparse.ArgumentParser(      description='MySQL到StarRocks数据同步工具',      formatter_class=argparse.RawDescriptionHelpFormatter)    # 通过 argparse 将数据库连接方式、需要同步的库表名等关键配置设置成脚本参数    parser.add_argument(      '--starrocks-host',      default='127.0.0.1',      help='StarRocks主机地址 (默认: 127.0.0.1)'    )      parser.add_argument(      '--starrocks-port',      type=int,      default=19030,      help='StarRocks端口 (默认: 19030)'    )    sync.datax_path = args.datax_path    success, message = sync.sync()# 同步python3 /root/datax_sync/mysql_to_starrocks.py test_db.sellerpython3 /root/datax_sync/mysql_to_starrocks.py test_db.goodpython3 /root/datax_sync/mysql_to_starrocks.py test_db.customerpython3 /root/datax_sync/mysql_to_starrocks.py test_db.orderhttps://img2024.cnblogs.com/blog/1267801/202512/1267801-20251231153417699-984508372.png
https://img2024.cnblogs.com/blog/1267801/202512/1267801-20251231153421029-1710699785.png
由上,cursor 通过基本的逻辑和封装,生成了一个可以实际运行 datax 任务的脚本,和现实的需求又近了一步
总结

整体评价: 水平>=初级工程师

首先从我一开始设定目标的完成情况来看,cursor 的水平和具备一定开发经验的初级工程师基本持平。在对 prompt 加上了适当指引后,不仅所有的步骤都能一次性完成,它还能做额外的小优化,比如 mysql 的 my.cnf,数据同步会通过脚本去执行,方便重复调用等
另外,cursor cli 这种后台的运行方式,也自带高效的标签: 你可以在它运行的时候分心去做其他事情,它就在后台默默地完成任务,遇到有问题时也会先自己尝试解决,就真的像和一位心态平稳同事之间在协作,完成更大的需求
一些不足

接着再说说我觉得不够满意的地方,也是感觉 cursor 能完成实际生产工作之间仍存在差距的地方
第一点就是在部分细节上,还需要我们来告诉它,比如 mysql 需要添加通过 127.0.0.1 的访问权限,DataX 才能正常使用;starrocks 的 be 注册到 fe 时,需要用 ipv4 ip 而不能用 127.0.0.1 等
第二个问题是我体会比较深的: 发送同一个 prompt ,每次执行的过程不稳定、不固定,这个情况在上述的每一步过程基本都遇到过
在 DataX 安装+依赖环境初始化中,大部分时候它都会装 JDK 1.8,但有一次它安装了 JDK 17;DataX 大部分情况都是直接下载 202306 那版安装包,但有一次不知为何触发了通过 mvn 编译得到安装包;在通过 DataX 同步数据的最后一步中,有时它会写一个 python 脚本负责生成 json 同步配置文件,但有时又会在会话中直接生成配置
这些差异,有的影响会比较小,但有的会导致过程,甚至结果都完全不一样了,出现的时机也是莫名其妙的。也正是因为这个问题,在生产环境要使用 cursor cli 去真正替代运维工作,恐怕还需假以时日
最后是大模型本身受限于它所掌握的知识范围,在安装开源新组件和新版本时,可能会出现安装版本过低或者配置错误的情况,从 starrocks 的安装就能看出来。不过这点还算是能理解了,毕竟能参考的资料也不多,作为人类也是需要学习时间的
我们应该如何使用

最后再来说说笔者的体会,至少在怎么用好 cursor cli 上有哪些值得做好的点

[*]在确定 cursor 发起的任务不会对环境造成影响的前提下,auto run 是必然要打开的,复杂任务必不能每一条指令都手动确认
https://img2024.cnblogs.com/blog/1267801/202512/1267801-20251231153429602-1616985474.png

[*]做什么任务(what)
任务描述要尽量限定在一个技术相关的范围。比如这次的数据同步,如果 prompt 只是很简单的说“要在两个数据库之间同步数据”,那么 cursor 直接就给你整个 python 脚本在内存中一条条读再一条条写入了。结果是对的,但是过程完全错误
[*]布置安排任务(how)
尽量把一个大的任务拆成小的 step by step,任务变小了,其实 AI 犯错的概率也能变低
[*]监督任务执行
有的长任务我们会放在后台执行,不过首次执行时,不定期到命令行确认执行情况,还是有必要的
实测中我发现如果它第一步方向已经做错了,cursor 还是会把过程继续下去,直到它“认为”完成了,这样 token 浪费了不少,结果还不对。如果刚好是你一眼就知道如何解决的错误,也可以直接暂停任务,修改 prompt 重新运行,减少不必要的等待
[*]通过脚本替代现实中的重复工作
目前来看,让它写脚本去做固定重复的任务很合适。这次我们探索性地完成了几张 mysql 表的同步,以及通过生成脚本支持了表名通过参数来设置,在现实需求中我们就可以把这个脚本用起来了
[*]maybe do more things
经过这次体验,我还有一个感叹的地方是它装一个自己测试用的数据库,真的比手动安装快多了。笔者之前写 mysql 的安装脚本,花了不少时间在踩坑、适配不同系统等等细节上,但现在让 cursor 来装,时间真的可以大大缩短。对我而言,就有了更多时间去思考还能做什么事情上

来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

供挂 发表于 2026-1-14 06:42:44

谢谢楼主提供!

澹台吉星 发表于 2026-1-15 02:01:03

喜欢鼓捣这些软件,现在用得少,谢谢分享!

呈步 发表于 2026-1-15 03:09:20

喜欢鼓捣这些软件,现在用得少,谢谢分享!

韶侪 发表于 2026-1-18 19:48:29

不错,里面软件多更新就更好了

匣卒 发表于 2026-1-20 15:15:54

很好很强大我过来先占个楼 待编辑

匡菲 发表于 2026-1-22 17:03:33

谢谢分享,辛苦了

东门芳洲 发表于 2026-1-25 03:12:52

新版吗?好像是停更了吧。

堠秉 发表于 2026-1-30 03:27:00

热心回复!

都淑贞 发表于 2026-1-30 04:05:15

感谢分享

搜娲瘠 发表于 2026-1-30 04:30:48

这个有用。

梁丘眉 发表于 2026-2-2 03:47:51

谢谢分享,试用一下

慎气 发表于 2026-2-3 07:57:45

前排留名,哈哈哈

祖柔惠 发表于 2026-2-4 03:19:22

东西不错很实用谢谢分享

颓哀 发表于 2026-2-5 04:46:01

鼓励转贴优秀软件安全工具和文档!

缢闸 发表于 2026-2-5 06:21:21

感谢发布原创作品,程序园因你更精彩

忆雏闲 发表于 2026-2-6 05:25:05

谢谢楼主提供!

莘度 发表于 2026-2-8 03:06:28

这个好,看起来很实用

站竣凰 发表于 2026-2-9 03:55:31

过来提前占个楼

汲佩杉 发表于 2026-2-10 04:35:33

喜欢鼓捣这些软件,现在用得少,谢谢分享!
页: [1] 2
查看完整版本: cursor cli 执行 ETL 数据同步任务探索