华为云高斯数据库:gsqlexec用法

A。脚本功能

复制代码
source ~/.bash_profile
gsqlexec "copy (SELECT * FROM station_power_day --源表
WHERE  period_date >= '2025-08-01 00:00:00.000000' AND period_date <= '2026-01-07 00:00:00.000000' )  to STDOUT" "$DQUERY" | gsqlexec "begin;
truncate table station_power_day_test  --目标表
;copy station_power_day_test --目标表
from STDIN;commit;" "$DTEST"
1. 加载环境变量
复制代码
source ~/.bash_profile
  • 作用:加载当前用户的环境变量,确保脚本可以访问必要的环境变量,如数据库连接信息等。
2. 导出和导入数据
复制代码
gsqlexec "copy (SELECT * FROM station_power_day --源表
WHERE  period_date >= '2025-08-01 00:00:00.000000' AND period_date <= '2026-01-07 00:00:00.000000' )  to STDOUT" "$DQUERY" | gsqlexec "begin;
truncate table station_power_day_test  --目标表
;copy station_power_day_test --目标表
from STDIN;commit;" "$DTEST"
  • 导出数据:

    • 从源表 station_power_day中导出满足条件的数据(period_date 在 2025-08-01 到 2026-01-07 之间)。

    • 使用 COPY 命令将数据导出到标准输出(STDOUT)。

  • 导入数据:

    • 清空目标表 station_power_day_test。

    • 将从标准输入(STDIN)接收到的数据导入到目标表 station_power_day_test。

    • 使用事务管理(BEGIN; 和 COMMIT;)确保操作的原子性。

B。脚本功能

这个脚本的目的是将 station_power_day 表中的数据分批导出,并导入到目标表 station_power_day_test 中。脚本按天粒度处理数据,确保每个批次的操作是独立的事务。

脚本解析

1. 加载环境变量
复制代码
source ~/.bash_profile
  • 作用:加载当前用户的环境变量,确保脚本可以访问必要的环境变量,如数据库连接信息等。
2. 定义分批导出和导入的函数
复制代码
batch_copy() {
    local start_date=$1
    local end_date=$2

    echo "Processing data from $start_date to $end_date"

    # 导出指定日期范围内的数据
    gsqlexec "COPY (SELECT * FROM station_power_day WHERE period_date >= '$start_date'::date AND period_date < '$end_date'::date) TO STDOUT" "$DQUERY" | \
    # 导入数据到目标表
    gsqlexec "BEGIN; DELETE FROM station_power_day_test WHERE period_date = '$start_date'::date; COPY station_power_day_test FROM STDIN; COMMIT;" "$DTEST"
}
  • batch_copy 函数:

    • 参数:

      • $1:start_date,表示当前批次的起始日期。

      • $2:end_date,表示当前批次的结束日期。

    • 功能:

      1. 导出数据:

        • 从源表 station_power_day 中导出指定日期范围内的数据。

        • 使用 COPY 命令将数据导出到标准输出(STDOUT)。

      2. 导入数据:

        • 开始一个事务。

        • 使用 DELETE 清空目标表 station_power_day_test 中指定日期的数据。

        • 使用 COPY 命令将数据导入到目标表。

        • 提交事务,确保所有操作生效。

3. 定义日期范围
复制代码
start_date="20251001"
end_date="20260107"
date_ranges=()

# 生成日期范围数组
while [[ "$start_date" < "$end_date" ]]; do
    date_ranges+=("$start_date")
    start_date=$(date -I -d "$start_date + 1 day" | tr -d '-')
done
  • 作用 :生成从 20251001 到 20260107 的日期范围,按天粒度。

  • 逻辑:

    • 使用 while 循环从 20251001 开始,逐天生成日期,直到 20260107。

    • 使用 date 命令生成下一个日期,并将其格式化为 YYYYMMDD 格式(通过 tr -d '-' 去掉日期中的 -)。

    • 将每个日期添加到 date_ranges 数组中。

4. 遍历日期范围并执行分批导出和导入
复制代码
for start_date in "${date_ranges[@]}"; do
    end_date=$(date -I -d "$start_date + 1 day" | tr -d '-')
    echo "Processing data from $start_date to $end_date"
    batch_copy "$start_date" "$end_date"
done
  • 功能:

    • 遍历 date_ranges 数组中的每个日期。

    • 对于每个日期,计算结束日期(当前日期的下一天)。

    • 调用 batch_copy 函数,处理当前日期范围内的数据。

    • 打印当前处理的日期范围,方便跟踪进度。

事务独立性

  • 每个批次的事务是独立的,因为每个批次都在自己的事务中完成操作。

  • 每个批次的操作包括:

    1. 导出数据:从源表导出指定日期范围内的数据。

    2. 清空数据 :使用 DELETE 清空目标表中指定日期的数据。

    3. 导入数据:将导出的数据导入到目标表。

    4. 提交事务:确保所有操作生效。

相关推荐
AI你一生一世2 小时前
不止于时序存储:DolphinDB 如何成为 AI 时代的工业智能底座
java·人工智能·struts·时序数据库·工业智能·dolphindb·ai基础设施
云-缩影2 小时前
拆解 AI 图像生成应用的后端架构:ECS、OSS 和大模型 API 怎么配合
java·spring boot·后端
ss2732 小时前
为什么PostgreSQL适合AI场景?
数据库·人工智能·postgresql
瑞克-桑切斯2 小时前
7、MySQL 慢查询排查与优化实战指南
java·服务器·数据库
全栈陈序员3 小时前
【Git】从入门到精通(五)—— git add:将文件加入暂存区
大数据·git·elasticsearch
z06.3 小时前
MySQL索引
数据库·mysql
考虑考虑3 小时前
Posrgresql恢复.backup文件
数据库·后端·postgresql
云祺vinchin3 小时前
中小企业备份软件选型从恢复需求到总体成本评估
数据库·数据备份·中小企业备份·容灾备份软件
Zenova EdgeOS4 小时前
Go 工业边缘错误处理实战:用 errors 构建可追溯错误链
开发语言·数据库·golang
KKKlucifer4 小时前
国内数据安全服务的产品智能化转型:大模型赋能下的技术能力重构分析
大数据·数据库·重构