SQL Alchemy - hỏi cách auto update database schema

Hi cả nhà,

Mình đang làm một sản phẩm bằng flask và có sử dụng thư viện Sql Alchemy để tương tác với database. Hiện mình đang qua giai đoạn phát triển sản phẩm nhưng đang gặp phải vấn đề khi mình thay đổi cấu trúc cơ sở dữ liệu thì nó sẽ xử lý như thế nào. Ví dụ ở version 1.0 mình có cấu trúc database gồm 10 bảng đi, lên ver 2 còn 9 bảng, thay đổi 1 chút về khoá chính khoá ngoại, thêm sửa 1 số cột. Vấn đề là làm sao để mình có thể thực hiện thay đổi đó cho người dùng đang dùng ver 1.0 nhỉ ?

Mình muốn giữ lại data nhiều nhất có thể. Khi người dùng nâng lên 2.0 nó sẽ tự detect và update database schema sao nó chạy được với ver 2.0 luôn và mất mát data ít nhất có thể ấy. Các table, các column không bị ảnh hưởng vẫn giữ được data của nó.

Mình thấy nếu như dùng lệnh sql để update cũng được nhưng sẽ thế nào khi mình khi một người V1 muốn upgrade trực tiếp lên V5 ? Không biết có thư viện hoặc biện pháp nào hay để xử lý case của mình không mọi người nhỉ?

Cảm ơn cả nhà.

Bạn có thể dùng thư viện Alembic, thư viện sẽ tự động đồng bộ hóa cấu trúc dữ liệu và tạo migration khi có thay đổi trong models của bạn. Bạn cũng có thể dùng Flask-Migrate, một wrapper của Alembic sử dụng trong Flask

3 Likes

Chân thành cảm ơn bác đã gợi ý.
Mình đã tìm hiểu 2 thư viện này và muốn confirm 1 chút xíu: Flask-Migrate là thư viện dùng cho flask_sqlalchemy nên nếu mình chỉ dùng sqlalchemy thì mình không thể sử dụng nó đúng không nhỉ ? Bác biết đấy sqlalchemy và flask-sqlalchemy là 2 thư viện khác nhau ấy.

Với cả mình có thêm một câu hỏi: các bài hướng dẫn dùng trực tiếp db.Model, trong khi mình dùng Base, mình đang tìm cách dùng cho trường hợp của mình không nhỉ ?

Chân thành cảm ơn bác một lần nữa.

Bạn có thể trực tiếp dùng Alembic để tạo migration files và tracking changes.

Nếu bạn sử dụng SQLAlchemy trên một db đã có sẵn thì bạn có thể xem qua AutoGenerate&Detect để kiểm tra phần có thể bị thiếu sót khi migrate.

3 Likes

Cảm ơn bạn đã chia sẻ, nhờ hướng dẫn của bạn mình đã làm được rồi.
Một lần nữa chân thành cảm ơn bạn.

@doanguyen Xin phép bác cho em hỏi thêm cái này.
Hiện tại mình đã dùng Alembic thì ok rồi, giờ mình muốn nhúng thẳng vô code python của mình thông qua API command. Nhưng sử dụng thư viện thì lại lỗi “No module named ‘alembic’”, không biết bác có biết nguyên nhân tại sao không chỉ hướng em với ạ. Make sure là mình đã cài đầy đủ alembic trong virtual environment của mình.

Chắc virtualenv của bạn có vấn đề thôi, mình mới kiểm tra lại thì không có vấn đề gì

83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?