Ta thường thấy khi thực hiện các hành động insert/update/delete trong Flask hoặc FastAPI, các lập trình viên thường sử dụng db.session() của Sqlachemy. Một cách cơ bản nhất, session bản chất là một phiên làm việc của code và database, trong quá trình này, code thực hiện một cơ số thao tác với dữ liệu trong DB nhưng về cuối cùng, tất cả dữ liệu đó chỉ được thực sự thay đổi khi ta gọi lệnh db.commit()

Tuy nhiên trong sqlachemy còn một lệnh nữa là flush(). Vậy có gì khác biệt ở đây? Trước khi thực hiện commit, tất cả các dữ liệu khi thực thi query là dữ liệu vào thời điểm session được mở. Phát sinh một nhu cầu là ta muốn insert/update/delete một hoặc một chuỗi các câu lệnh nào đó, xong query tiếp, nếu dữ liệu sau khi thay đổi đã thỏa mãn điều kiện đặt ra thì mới commit() vào db thì làm thế nào. Đây là thời điểm để sử dụng flush(), flush() sẽ thực hiện các thay đổi trong database nhưng vẫn ở bên trong session. Sau đó khi run commit() thì các thay đổi mới thực sự diễn ra trong DB thật.

Tất nhiên hoàn toàn có thể commit() mà không cần dùng flush(). Và luôn phải nhớ, flush() cần được sử dụng trước commit().

Note: Thông thường trong các hệ thống, khi người dùng call API, một session sẽ được mở ra và tất cả hành động chỉnh sửa dữ liệu chỉ được commit() trước khi return một response (có nghĩa là phải qua toàn bộ validate, query hợp lệ, …)