SQLITE-UTILS 4.0: cách chúng ta đặt lại nền móng cho cơ sở dữ liệu

Trong thế giới phát triển phần mềm, việc cơ sở dữ liệu phải thay đổi theo thời gian là chuyện thường như cơm bữa. Schema cần được cập nhật, bảng biểu cần thêm cột, kiểu dữ liệu cần chỉnh sửa. Đây là một quá trình vừa cần thiết vừa tiềm ẩn rủi ro nếu không được quản lý bài bản. Mới đây, Simon Willison đã công bố sqlite-utils 4.0, một bản phát hành quan trọng thứ 124 của dự án và là lần tăng số phiên bản chính đầu tiên kể từ 3.0 vào tháng 11 năm 2020. Phiên bản này không chỉ mang đến vài thay đổi nhỏ nhưng đáng kể (được mô tả trong hướng dẫn nâng cấp) mà còn giới thiệu ba tính năng chính: cơ chế database migrations, hỗ trợ nested transactions thông qua phương thức db.atomic() mới, và khả năng sử dụng compound foreign keys. Trong ba tính năng mới, tôi tin database schema migrations là điểm nhấn lớn nhất. Tính năng này cho phép bạn định nghĩa một chuỗi các thay đổi cần thực hiện với cơ sở dữ liệu SQLite của mình, đồng thời có cơ chế theo dõi những thay đổi nào đã được áp dụng và những thay đổi nào còn đang chờ xử lý. Các migration được viết bằng file Python, tận dụng thư viện sqlite-utils với phương thức table.transform() cực kỳ mạnh mẽ. table.transform() giải quyết được những hạn chế của câu lệnh ALTER TABLE truyền thống của SQLite bằng cách tạo một bảng tạm với schema mới, sao chép dữ liệu, sau đó xóa bảng cũ và đổi tên bảng tạm thay thế – một phương pháp được chính tài liệu SQLite khuyến nghị. Chẳng hạn, bạn có thể tạo một bảng creatures, thêm cột weight, rồi đổi kiểu dữ liệu của species sang int và weight sang str theo từng bước rõ ràng thông qua các hàm được đánh dấu bằng @migrations(). Để áp dụng các migration này, tôi chỉ cần lưu chúng vào một file như migrations.py và chạy lệnh uvx sqlite-utils migrate data.db migrations.py. Hệ thống sẽ tự động tạo một bảng _sqlite_migrations để ghi lại những thay đổi đã chạy, giúp tôi dễ dàng kiểm soát lịch sử của cơ sở dữ liệu. Nếu không chỉ định file cụ thể, lệnh này thậm chí còn có thể quét thư mục hiện tại và các thư mục co