用 Codex 做匯入預覽:檔案變了,就拒絕舊計劃

5 分鐘閱讀
預覽通過後,原檔案或匯入批次又被修改了怎麼辦?用獨立計劃、輸入指紋及提交前複查,讓舊預覽停止執行。

匯入預覽看起來沒問題,準備提交時,原檔案卻被另一個操作改過了。之前確認的預覽,還能直接執行嗎?

這次接着整批檢查後再寫入檔案的教學例子,把預覽與提交拆成兩次操作,中間多加一次輸入對照。資料仍是自建 JSON,不是真實庫存。

預覽時留下甚麼

程式讀取原檔案與待匯入批次,完成整批檢查,再建立一份獨立的計劃檔案,儲存兩份輸入各自的 SHA-256 指紋及計算出的預覽結果。

這裏的「預覽」會建立計劃檔案,但不修改庫存副本。計劃路徑已經存在時拒絕覆蓋;重新預覽要用一個新檔名。

SHA-256 用於計算檔案位元組的摘要。同一份內容只要空白字元或換行有變化,本例也會視為輸入變化;它沒有試圖判斷兩份 JSON 的業務含義是否相同。Python:hashlib

提交時再讀一次

提交指令重新讀取兩份輸入,與計劃中的指紋比較。任何一份不同,就拒絕舊計劃並保留目前的庫存檔案。

兩份輸入都相同時,程式仍會重新檢查整批、計算結果,再對照計劃裏的預覽。通過後才寫入指定測試副本;寫入前還會再次檢查庫存檔案是否與剛讀取的位元組一致。

這些檢查沒有持有檔案鎖。檢查結束到替換檔案之間仍有時間間隔,不能據此聲稱支援併發寫入。os.replace 的文件也不能取代針對實際檔案系統的故障及恢復測試。Python:os.replace

可以直接交給 Codex 的任務

這是自建 JSON 庫存匯入教學項目,先在可替換的測試副本演練。
增加獨立的預覽計劃,記錄原檔案和匯入批次各自的指紋及預覽結果。
提交前重新讀取兩份輸入、比較指紋,並再次檢查和計算結果。
輸入或計劃中的預覽不一致就停止,保留目前的庫存檔案。
計劃檔案已存在時不覆蓋,用新檔名重新預覽。
提供原檔案變化、批次變化、輸入未變三個提交場景。
保留退出碼,寫入後重新讀取舊記錄、新記錄及庫存 0,並說明未覆蓋的範圍。

下載後先試輸入未變的情況

下載教學程式碼、樣例及8項驗收

解壓到一個新資料夾,在 PowerShell 中執行。以下的 test-store.json 是明確可替換的測試副本:

Copy-Item fixtures/store.json test-store.json
Copy-Item fixtures/good-batch.json test-batch.json
python -B test_guarded_import.py
Get-FileHash test-store.json -Algorithm SHA256
python -B guarded_import.py preview --store test-store.json --input test-batch.json --plan test-plan.json
$LASTEXITCODE
Get-FileHash test-store.json -Algorithm SHA256

預覽退出碼應為 0,兩次庫存檔案雜湊值相同。檢查計劃檔案,確認預覽是舊記錄一條、新記錄兩條後,再執行:

Get-Content test-plan.json -Raw
python -B guarded_import.py commit --store test-store.json --input test-batch.json --plan test-plan.json
$LASTEXITCODE
Get-Content test-store.json -Raw

提交會替換 test-store.json。預期退出 0,重新讀取後有 3 條記錄,當中 NEW01 的庫存為數值 0。

再刻意讓預覽過期

用不同的副本及計劃名稱,避免覆蓋前一個場景:

Copy-Item fixtures/store.json changed-store.json
Copy-Item fixtures/good-batch.json changed-batch.json
python -B guarded_import.py preview --store changed-store.json --input changed-batch.json --plan changed-plan.json
python -c "from pathlib import Path; p=Path('changed-store.json'); p.write_bytes(p.read_bytes()+b' ')"
Get-FileHash changed-store.json -Algorithm SHA256
python -B guarded_import.py commit --store changed-store.json --input changed-batch.json --plan changed-plan.json
$LASTEXITCODE
Get-FileHash changed-store.json -Algorithm SHA256

這裏只追加一個空白字元,JSON 仍能解析,但位元組已不同。預期得到 store_changed_after_preview,退出 2;提交前後兩次雜湊值相同,代表保留的是變更後目前的檔案,沒有用舊計劃覆蓋它。

批次變化的場景由下載包中的驗收測試覆蓋,對應錯誤為 batch_changed_after_preview。發現變化後,先確認目前的檔案,再用新的計劃名稱重新預覽;不要把原檔案改回舊值,只為讓檢查通過。

原始執行結果及適用範圍

2026 年 10 月 28 日,Windows / Python 3.13.5 實際完成 8 項驗收及 4 個指令場景:只預覽不改庫存副本;原檔案變化後拒絕提交並保留變更後的檔案;批次變化後拒絕提交且庫存不變;輸入未變時提交成功,重新讀取後有 3 條記錄並保留 0。兩次拒絕均退出 2,成功退出 0。程式碼與原始樣例雜湊值未變,沒有 API 呼叫。

本文於 2026 年 10 月 29 日整理並複查官方資料,沿用上述原始執行記錄。指紋不是簽署或檔案鎖;檔案變化後又恢復為相同位元組,也不會被這個對照發現。沒有驗證真實庫存、併發、磁碟故障或斷電恢復。

補充資料:JSON 解碼及類型轉換、unittest 斷言。教學程式碼與文章含 AI 輔助。

下載包的說明及註解已整理為香港繁體中文,指令、欄位名稱及錯誤識別字保留原樣。

查看 AI Coding 系列全部文章

相關文章