[Django] Migration vỡ lòng -Part 1

taiphuong
3 min readMay 30, 2019

Kể từ version 1.7, Django đã được hỗ trợ tích hợp migration. Ở Django, database migrations thường được dùng để đi đôi (go hand in hand) với models, mỗi khi bạn code thêm một model mới, bạn sẽ generate một migration để tạo các bảng cần thiết trên database(db). Tuy nhiên, migration có thể làm nhiều hơn như thế.

Bạn sẽ học được gì ở bài viết này:

  • Cách tạo db tables, không cần viết SQL.
  • Cách tự động thay đổi trên databases sau khi bạn thay đổi model
  • Cách revert sự thay đổi trên db.

Vấn đề mà Migration cần giải quyết

Nếu bạn là người mới dùng Django hay web dev nói chung, bạn có thể không quen với định nghĩa của db migration và dường như bạn cũng nghĩ đó là 1 ý tưởng hay.

Đầu tiên, hãy xác định nhanh một số thuật ngữ để chắc chắn mọi người đều hiểu. Django được thiết kế để làm việc với relational database (Cơ sở dữ liệu quan hệ), được lưu trữ SQL Management như Postgres, Mysql, SQLite.

Trong relational database, data được tổ chức ở các table. Một db table chắc chắc chứa số lượng cột, còn dòng thì không. Mỗi cột được định nghĩa cho một kiểu dữ liệu(datatype), như là string(100), int, float…Sự mô tả của tất cả các table với số cột của chúng và datatype tương ứng được gọi là database schema.

Tất cả hệ thống db được hỗ trợ bởi Django dùng để create, read, update, delete (CRUD) trong relational db. SQL cũng được dùng để create, change, delete trên db của nó.

Làm việc trực tiếp với SQL khá là kồng kềnh, nên để cho cuộc sống dễ dàng hơn, Django đi kèm (come with) một object-relational mapper (ORM). Thằng ORM này nối relation db tới thế giới của OOP. Thay vì định nghĩa ở SQL, giờ thì ta chỉ cần khai báo trên Django Models.

Đây là 1 một ví dụ:

Django Example Mapping Diagram.

Nhưng đây chỉ là define model class trên Python file, nó chưa tạo sự thay đổi nào trên db table cả. Việc tạo ra db table để lưu lại models trên Django là việc của database migration. Thêm vào đó mỗi khi có bất cứ sự thay đổi nào trên model, db này sẽ thay đổi theo. Migrations cũng xử lý việc đó.

Dưới đây là cách migration của Django làm cuộc sống dễ hơn hơn.

Tạo ra sự thay đổi ở db không cần SQL

Không có migration, bạn sẽ phải connect với db và gõ một số command của SQL hoặc dùng 1 graphic tool như là PHPMyAdmin để làm mọi thứ bạn muốn. Trừ mội số trường hợp nâng cao.

Đảm bảo đồng bộ giữa định nghĩa ở model và database chema.

Thông thường, bạn có nhiều trường hợp (instance) trên db, ví dụ như 1 db có nhiều developer trong 1 team. một db cho test và db cho live.

Không có migration, bạn sẽ phải thực hiện sự thay đổi các schema này mỗi db của bạn, và bạn sẽ phải theo dõi (keep track) những thay đổi đã được thực hiện cho cơ sở dữ liệu nào.

Với Django Migrations, bạn có thể dễ dàng giữ nhiều db khi đồng bộ với model của bạn.

Theo dõi thay đổi relational db trong Version Control.

Một Version Control System, như Git là tuyệt vời cho source code, nhưng không nhiều cho các lược đồ cơ sở dữ liệu.

Việc migrations đơn giản nhưng trong Django, bởi vì bạn có thể push phần source code migration lên bất kỳ Version Control System nào.

Đến bây giờ, mình hy vọng bạn sẽ bị thuyết phục rằng migration một công cụ hữu ích và mạnh mẽ. Hãy bắt đầu học cách giải phóng sức mạnh của bạn (unplash your power).

Bài viết được dịch từ: https://realpython.com/django-migrations-a-primer/Được dịch từ tiếng anh và viết cho dev nên mình cố gắng không dịch trọn nghĩa, đó là các keywork giúp các bạn hiểu rõ chủ đề hơn.

Thank all from a chill developer.

--

--