大多数 CSV 导入脚本常犯的错误(以及如何修复)

发布: (2026年3月3日 GMT+8 01:17)
3 分钟阅读
原文: Dev.to

Source: Dev.to

Introduction

大多数 CSV 导入脚本都是在 30 分钟内写好的。
大多数导入失败要到 3 个月后才被发现。

问题不在 CSV 本身。
问题在于缺少保证。

在小团队中,CSV 导入通常是这样:

Read file
Loop rows
Insert into database
Print “Done”

它能工作——直到导出格式发生变化。

What Most Ingestion Scripts Get Wrong

Assumption: Column Order Never Changes

许多脚本依赖位置映射,这最终会导致破裂。
不要相信列的顺序,而是显式验证表头:

EXPECTED_HEADERS = [
    "date",
    "customer_id",
    "amount",
    "currency",
    "status"
]

if headers != EXPECTED_HEADERS:
    raise ValueError("Schema mismatch detected")

有意进行顺序敏感的比较。
如果上游更改,导入应立即停止。
静默漂移比崩溃更糟。

Guardrails for Empty or Truncated Files

空的 CSV 导入不应成功,报告只有 12 行而不是 1,200 行也不应悄悄通过。

if len(rows) == 0:
    raise RuntimeError("Empty export detected")
if len(rows) > ingestion.log 2>&1

人会忘记,Cron 不会。
自动化不仅仅是执行——更是确定性的状态转换。

Guarantees of a Safe Ingestion Pipeline

  • 结构完整性 – 验证的模式和表头
  • 数量合理性 – 行数的防护措施
  • 原子写入 – 事务边界
  • 安全重试 – 幂等 upsert 和唯一约束

其他一切都是乐观估计。

Further Reading

我在这里写了更深入的确定性导入架构拆解——包括文件归档、可观测性和生产安全措施:

Automating CSV to PostgreSQL Safely Using Python (Deterministic Ingestion)

了解如何使用模式验证、行验证、事务和 upsert 将脆弱的手动 CSV 导入替换为确定性的 Python 导入管道。

0 浏览
Back to Blog

相关文章

阅读更多 »

不糟糕的语义失效

缓存问题 如果你在 Web 应用上工作了一段时间,你就会了解缓存的情况。你加入缓存,一切都变快了,然后有人……

按组反转数组

问题描述:将数组按给定大小 k 分组后逆序。数组被划分为长度为 k 的连续块(窗口),每个块都被逆序。