# Cập nhật SQLITE-UTILS 4.1: từ đổ dữ liệu đến chế độ strict

Đăng ngày: 2026-07-18

Simon Willison vừa giới thiệu sqlite-utils 4.1, một bản phát hành dot-release với nhiều tính năng mới tuy nhỏ nhưng khá thiết yếu. Với tôi, đây là một ví dụ điển hình về cách một công cụ được phát triển liên tục, lắng nghe những "điểm đau" nhỏ nhất của người dùng và giải quyết chúng một cách tinh tế. Giờ đây, khi sử dụng sqlite-utils insert và sqlite-utils upsert, chúng ta có thể dùng tùy chọn --code để truyền vào một khối mã Python hoặc đường dẫn đến một file .py. Khối mã này phải định nghĩa hàm rows() hoặc một iterable chứa các hàng dữ liệu cần chèn. Điều này mở ra khả năng linh hoạt hơn nhiều trong việc tạo và cung cấp dữ liệu, không còn chỉ giới hạn ở việc import từ file, và là một sự mở rộng hợp lý từ cách lệnh sqlite-utils convert vốn đã hỗ trợ truyền mã Python. Một cải tiến khác, sau một thời gian dài được yêu cầu, là khả năng ghi đè kiểu dữ liệu mặc định. Lệnh sqlite-utils insert và sqlite-utils upsert giờ chấp nhận --type column-name type. Điều này cực kỳ hữu ích cho những cột trong file CSV hay TSV mà thoạt nhìn giống số nguyên, như mã ZIP code, nhưng thực tế cần được lưu trữ dưới dạng TEXT để giữ lại các số 0 ở đầu. Vấn đề nhỏ này từng gây không ít phiền toái, nhưng giờ đã có giải pháp đơn giản. Bản 4.1 cũng bổ sung phương thức table.drop_index(name) và lệnh sqlite-utils drop-index để xóa một index theo tên, với tùy chọn --ignore để bỏ qua lỗi nếu index không tồn tại. Lệnh sqlite-utils query giờ cũng linh hoạt hơn, có thể đọc truy vấn SQL từ standard input bằng cách truyền ký tự - thay vì trực tiếp câu lệnh. Đáng chú ý là sqlite-utils upsert nay có thể tự động suy luận khóa chính của một bảng đã tồn tại, giúp chúng ta không cần chỉ định --pk. Tính năng này xuất phát từ một gợi ý của mô hình AI Codex, cho thấy AI không chỉ hỗ trợ viết code mà còn có thể phát hiện những thiếu sót nhỏ trong thiết kế CLI hay API. Cuối cùng, một thay đổi quan trọng hơn là việc table.transform() và table.transform_sql() nay chấp nhận strict=True hoặc strict=False để thay đổi chế độ strict của bảng SQLite. Lệnh sqlite-utils transform cũng có các tùy chọn --strict và --no-strict. Ý tưởng này được khơi gợi từ bài viết của Evan Hahn về việc sử dụng các bảng STRICT trong SQLite. Evan chỉ ra rằng không có cách nào để ALTER một bảng sang chế độ strict mà phải copy dữ liệu sang một bảng mới. Cơ chế transform của sqlite-utils vốn dĩ làm điều này, nên việc mở rộng để hỗ trợ chế độ strict là hoàn toàn hợp lý. Tôi thấy thú vị là Willison còn dùng AI (mô hình GPT-5.6 Sol xhigh Codex) để "kiểm thử thủ công" bằng cách ra lệnh cho nó tìm các trường hợp biên và lỗi, và cách này đã giúp phát hiện hai vấn đề nhỏ sau đó được sửa chữa. Nhìn chung, sqlite-utils 4.1 là một bản cập nhật vững chắc, không chỉ bổ sung các tính năng tiện lợi mà còn minh họa cách những công cụ tuyệt vời được xây dựng: lắng nghe người dùng, giải quyết các chi tiết nhỏ và không ngại tận dụng công nghệ mới như AI để cải thiện quy trình phát triển và chất lượng sản phẩm. Đó là tinh thần mà tôi luôn trân trọng ở các dự án mã nguồn mở.

Canonical: https://www.tungpham.vn/blog/cap-nhat-sqlite-utils-41-tu-do-du-lieu-den-che-do-strict
