SQLite vừa "skip" một bản — bản mới thì đáng gờm
SQLite 3.53.0 mang đến ALTER TABLE xịn hơn, JSON mạnh hơn, và CLI đẹp đến bất ngờ — sau khi bản 3.52.0 bị rút lại âm thầm.
Bụi WireBạn có biết database nào đang chạy trong app AI của bạn không?
Câu hỏi này nghe hơi kỳ, nhưng thử nghĩ xem: mỗi lần bạn dùng một tool AI local, một con agent chạy trên máy, hay thậm chí cái app điện thoại bạn mở mỗi sáng — phía dưới, rất có thể SQLite đang lặng lẽ gánh team.
SQLite vừa ra bản 3.53.0. Nhưng khoan — bản 3.52.0 đâu rồi? Plot twist: nó bị rút lại. Tức là SQLite team đã ship, nhận ra vấn đề, và quyết định "thôi, gom hết vào bản sau cho chắc". Kết quả? Bản 3.53.0 ra đời với một đống thay đổi tích lũy, và vài cái trong đó khiến mình phải đặt cốc cà phê xuống.
Sửa giáo trình mà không cần in lại cả cuốn sách
Nếu bạn từng dùng SQLite để lưu config, embedding, hay metadata cho pipeline AI, bạn biết cái đau này: muốn sửa constraint trên cột — thêm NOT NULL chẳng hạn — là phải tạo bảng mới, copy data sang, xóa bảng cũ, đổi tên. Giống như muốn sửa một lỗi chính tả trong giáo trình mà phải in lại cả cuốn.
Giờ thì ALTER TABLE đã hỗ trợ thêm và xóa NOT NULL cùng CHECK constraints trực tiếp. Để mình diễn giải: bạn có thể chỉnh giáo trình ngay trên bản gốc, không cần tái bản. Bảng vẫn chạy, data vẫn nguyên, một câu ALTER là xong.
Ví dụ cụ thể: Giả sử team bạn 4 người đang xây một RAG pipeline, lưu document chunks vào SQLite. Ban đầu cột embedding cho phép NULL vì "thêm sau cũng được". Đến lúc production, bạn muốn enforce NOT NULL để tránh query trả về kết quả rỗng. Trước đây? Chuẩn bị tinh thần viết migration script dài cả trang. Giờ? Một dòng ALTER TABLE, đi pha cà phê về là xong.
JSON xử lý tại chỗ — ít round-trip, ít chỗ cho bug trốn
Bản mới thêm json_array_insert() cùng phiên bản jsonb tương ứng. Với những ai đang dùng SQLite để lưu structured output từ LLM — JSON response, tool call results, agent state — đây là tin vui thiệt sự.
Hình dung thế này: agent của bạn trả về một mảng JSON chứa các bước đã thực hiện. Bạn muốn chèn thêm một bước review do con người thêm vào, ngay giữa flow. Trước đây bạn phải parse JSON ra application layer, chèn phần tử, rồi ghi lại. Giờ SQLite tự xử lý việc đó ngay trong query — không cần code trung gian.
Tóm gọn lại thì: ít round-trip giữa app và database hơn, ít code glue hơn, ít chỗ để bug núp.
CLI lột xác — và câu chuyện WebAssembly từ điện thoại
Phần mình thấy thú vị nhất lại không phải SQL feature. SQLite CLI giờ có result formatting xịn hơn hẳn, nhờ một thư viện mới tên Query Results Formatter. Simon Willison — người theo dõi SQLite sát nhất cộng đồng — đã dùng Claude Code trên điện thoại để compile thư viện này sang WebAssembly và tạo một playground demo cho mọi người thử.
Đúng rồi, trên điện thoại. Một ông dev ngồi ở đâu đó, mở phone, bảo AI compile C sang WASM, rồi deploy playground cho cả cộng đồng nghịch. Nếu bạn đang tự hỏi "AI coding assistant thật sự hữu ích ở đâu?" — thì đây, nó hữu ích ở những lúc bạn không ngồi trước bàn phím mà vẫn muốn ship.
Thử ngay chiều nay — 20 phút là đủ
Bước 1 — Check version hiện tại:
Nếu đang dùng Python, chạy nhanh:
python3 -c "import sqlite3; print(sqlite3.sqlite_version)"
Nhiều Linux distro và macOS sẽ cập nhật qua package manager trong vài tuần tới. Muốn nhanh thì download binary từ trang chủ SQLite.
Bước 2 — Test ALTER TABLE constraint mới:
CREATE TABLE demo (id INTEGER PRIMARY KEY, name TEXT);
INSERT INTO demo VALUES (1, 'test');
ALTER TABLE demo ALTER COLUMN name SET NOT NULL;
Bước 3 — Nghịch json_array_insert():
SELECT json_array_insert('[1,2,3,4]', '$[2]', 99);
-- Kết quả: [1,2,99,3,4]
Muốn thử Query Results Formatter thì playground WebAssembly của Simon Willison đã có sẵn online — chạy ngay trên browser, không cần cài gì.
Cái bẫy quen thuộc: SQLite ngon quá nên quên giới hạn
Một sai lầm mình thấy nhiều team mắc: dùng SQLite cho prototype xong, lên production vẫn giữ nguyên mà không nghĩ lại kiến trúc. SQLite rất mạnh cho single-writer workload, nhưng nếu bạn có nhiều agent ghi đồng thời vào cùng một database file — kiểu mỗi agent một thread, ai xong trước ghi trước — bạn sẽ gặp lock contention.
Nói cho vuông: SQLite không phải là Postgres, và nó không cần phải là Postgres. Nếu workload AI của bạn là đọc nhiều, ghi ít, chạy local — SQLite là ông thầy kiên nhẫn nhất bạn tìm được. Nếu bạn cần concurrent writes từ chục agent cùng lúc — hãy bật WAL mode trước, rồi nếu vẫn không đủ thì cân nhắc Postgres hoặc DuckDB tùy use case.
Và nếu bạn đang dùng sqlite-utils (thư viện Python của chính Simon Willison) — ông ấy note rằng trước đây phải dùng hàm transform() riêng để xử lý constraint, giờ SQLite native đã làm được. Một open-source tool bớt đi một workaround — đó luôn là dấu hiệu tốt cho cả hệ sinh thái.
Một takeaway duy nhất
SQLite 3.53.0 không phải bản release gây sốc. Nhưng nó là kiểu upgrade mà khi bạn đang debug lúc 11 giờ đêm, bỗng nhận ra "ơ, giờ mình không cần viết cái migration script 50 dòng đó nữa" — rồi thầm cảm ơn.
Database tốt nhất là database bạn không phải nghĩ về nó. Và SQLite đang ngày càng giỏi hơn trong việc... biến mất.
---
Bụi Wire — nghiện đọc release notes lúc 2 giờ sáng