Một thư viện testing Python mới có tên py-pglite đã gây ra cuộc thảo luận sôi nổi trong cộng đồng developer về cách tiếp cận testing cơ sở dữ liệu. Thư viện này hứa hẹn mang toàn bộ tính năng của PostgreSQL vào các bài test Python thông qua PGlite, một phiên bản PostgreSQL được biên dịch bằng WebAssembly chạy trong Node.js. Tuy nhiên, cộng đồng đang đặt câu hỏi liệu cách tiếp cận này có thực sự mang lại sự đơn giản và hiệu suất như đã hứa hẹn hay không.
Các tuyên bố về hiệu suất đang bị xem xét kỹ lưỡng
Marketing của thư viện nhấn mạnh hiệu suất cực nhanh thông qua PostgreSQL in-memory, nhưng các developer đang phản bác những tuyên bố này. Những người chỉ trích chỉ ra rằng WebAssembly chạy bên trong Node.js khó có thể vượt trội hơn native PostgreSQL code đã được tối ưu hóa trong nhiều thập kỷ. Các lớp abstraction bổ sung - Python gọi Node.js chạy WebAssembly - đặt ra câu hỏi liệu setup này có thể thực sự nhanh hơn các giải pháp thay thế đã được thiết lập như TestContainers hoặc native PostgreSQL instances hay không.
Một số thành viên cộng đồng đã chia sẻ kinh nghiệm của họ với TestContainers, báo cáo thời gian thực thi test có vẻ cạnh tranh với những lời hứa của py-pglite. Một developer lưu ý rằng các test dựa trên TestContainers của họ với PostgreSQL chỉ mất nhiều hơn 30 giây so với test SQLite, cho thấy khoảng cách hiệu suất có thể không đáng kể như py-pglite tuyên bố.
So sánh hiệu suất (TestContainers so với SQLite):
- Kiểm thử SQLite với Python 3.9: 3 phút 41 giây
- Kiểm thử PostgreSQL với TestContainers: 4 phút 11 giây
- Chênh lệch: Chỉ chậm hơn 30 giây để có khả năng tương thích hoàn toàn với PostgreSQL
Tình huống khó xử với dependency Node.js
Có lẽ khía cạnh gây tranh cãi nhất của py-pglite là dependency vào Node.js và quản lý gói npm tự động. Thư viện quảng cáo không cần cài đặt PostgreSQL như một điểm bán hàng, nhưng các developer nhanh chóng nhận ra sự mỉa mai: bản thân Node.js có dung lượng 63MB so với 32MB của PostgreSQL. Điều này đã dẫn đến câu hỏi liệu việc đánh đổi dependency có hợp lý hay không.
Tôi không thể tưởng tượng một wasm chạy bên trong nodejs có thể nhanh hơn native code đã được tối ưu hóa trong nhiều thập kỷ. postgres có dung lượng 32MB, nodejs có dung lượng 63MB.
Điều đáng quan ngại hơn đối với nhiều developer là việc thư viện tự động cài đặt npm dependencies trong runtime. Hành vi này, được bật mặc định, đã làm dấy lên lo ngại về khả năng tương thích với các setup Node.js hiện có và các công cụ security scanning. Mặc dù tính năng này có thể được tắt, việc thiếu tài liệu rõ ràng về quản lý Node.js dependencies thủ công đã làm frustrate các người dùng tiềm năng.
So sánh kích thước:
- PostgreSQL: 32MB
- Node.js: 63MB
- py-pglite yêu cầu Node.js 18+ và Python 3.10+
Các giải pháp thay thế đang thu hút sự chú ý
Cuộc thảo luận đã làm nổi bật một số giải pháp thay thế mature mà các developer đã sử dụng thành công. TestContainers nổi lên như một lựa chọn phổ biến, cung cấp các PostgreSQL instances thực trong Docker containers với overhead setup tối thiểu. Các developer khác đề cập đến pytest-docker-compose và các giải pháp embedded-postgres tránh hoàn toàn dependency Node.js.
Một số thành viên cộng đồng đang khám phá các cách tiếp cận tham vọng hơn, chẳng hạn như biên dịch PostgreSQL trực tiếp thành Python extensions hoặc sử dụng WASI runtimes để loại bỏ yêu cầu Node.js. Những thảo luận này cho thấy rằng mặc dù py-pglite giải quyết một nhu cầu thực sự, cộng đồng thấy có chỗ để cải thiện trong cách tiếp cận implementation.
Nhìn về tương lai
Bất chấp những chỉ trích, py-pglite đã tạo ra sự quan tâm thực sự cho nỗ lực đơn giản hóa PostgreSQL testing trong Python. Tác giả của thư viện đã thừa nhận phản hồi và phác thảo kế hoạch cho các phiên bản tương lai có thể giải quyết một số hạn chế hiện tại, bao gồm hỗ trợ tiềm năng cho native binaries và quản lý dependency tốt hơn.
Cuộc tranh luận phản ánh một thách thức rộng lớn hơn trong hệ sinh thái Python: cân bằng giữa sự tiện lợi với hiệu suất và quản lý dependency. Mặc dù py-pglite có thể không phải là giải pháp hoàn hảo, nó đã khơi dậy những thảo luận có giá trị về chiến lược testing và làm nổi bật nhu cầu liên tục về các công cụ database testing tốt hơn trong phát triển Python.
Tham khảo: py-pglite