sqlite-utils 4.1 是自 4.0 發佈幾天後的第一個小版本更新,帶來了多項實用的新功能。其中最引人注目的是 insert 和 upsert 命令新增的 --code 選項,允許用户直接在命令行中嵌入 Python 代碼塊(或指定 .py 文件路徑),定義 rows() 函數或 rows 可迭代對象來生成待插入的數據行,無需再依賴文件導入。這一功能擴展了 sqlite-utils 已有的內嵌 Python 代碼模式,例如先前在 convert 命令中使用的代碼塊。
另一個實用的新增是 --type 選項,用於在通過 insert 或 upsert 創建表時覆蓋自動推斷的列類型。這對於 CSV 或 TSV 中的 ZIP 碼之類的列特別有用,它們看起來像整數,但為了保留前導零必須存儲為 TEXT 類型。這是一個長期存在的功能請求,實現卻相當簡單。
在索引管理方面,新增了 table.drop_index(name) 方法和對應的 sqlite-utils drop-index 命令,用於按名稱刪除索引,同時支持 ignore=True/--ignore 選項忽略不存在的索引。此外,sqlite-utils query 命令現在可以通過傳遞 - 代替查詢字符串來從標準輸入讀取 SQL,例如 echo "select * from dogs" | sqlite-utils query dogs.db -。
對於 upsert 操作,現在可以自動推斷已有表的主鍵,因此在向已設置主鍵的表執行 upsert 時無需再指定 --pk,這是一個由 Codex 提示的簡化改進。
最值得關注的新特性是 table.transform() 和 table.transform_sql() 方法現在接受 strict=True 或 strict=False 參數,用於切換表的 SQLite STRICT 模式。如果省略該參數,則保持現有模式。相應的,sqlite-utils transform 命令也新增了 --strict 和 --no-strict 選項。這一功能的靈感來源於 Evan Hahn 的《Prefer STRICT tables in SQLite》一文,文中指出無法通過 ALTER TABLE 直接更改嚴格模式,而 sqlite-utils 的 transform 機制正是通過複製數據到新表來實現此類變更,因此很容易擴展以支持嚴格模式切換。作者使用 GPT-5.6 Sol xhigh Codex 實現了該功能,並特別通過手動測試發現了兩個小問題並修復。