Django Automatic DB Migration and Automatic DB Seeding

Yudhistira Erlandinata
Energizer AAA
Published in
3 min readApr 18, 2019

“Data dummy Job Listing kemarin kehapus karena sesuatu”

— Yudhistira Erlandinata kepada Kak Reby (product owner) ketika sprint review

Gambar 1. Ilustrasi seeding

Apa yang terjadi apabila terdapat penambahan relasi atau perubahan field pada database? Tentunya harus ada operasi “CREATE TABLE” atau “ALTER TABLE”. Proses ini adalah bagian dari database migration. Pekerjaan ini sangat melelahkan, untungnya Django memiliki fitur automatic migration.

python manage.py makemigrations && python manage.py migrate

Perintah pertama harus dijalankan setiap kali developer membuat perubahan relasi. Sedangkan perintah kedua harus selalu dijalankan tepat sebelum webserver berjalan. Perintah makemigrations harus dijalankan dengan hati-hati dan sesuai SOP tim, kalau sembarangan maka semuanya akan menjadi kacau.

Django Automatic Migration

Inti dari DB migration adalah membuat segala perubahan pada database bersifat “reversible”. Idenya adalah, “git saja dapat membuat kode menjadi reversible, mengapa database tidak?”.

Gambar 2. Cuplikan kode yang dihasilkan oleh perintah makemigrations

Perintah ini akan menghasilkan kode “CREATE TABLE” dan “ALTER TABLE” yang dibungkus oleh library Django secara otomatis tergantung dari perubahan definisi model. Kode yang dihasilkan akan ditaruh pada folder migrations. Kode ini harus sesegera mungkin di-commit, di-push, dan di-merge agar semua orang dalam tim punya satu versi migration. Apabila push ditunda-tunda, seorang developer lain mungkin juga melakukan makemigrations dan ketika hal ini benar-benar terjadi, maka akan terjadi git conflict. Kasus yang lebih parah lagi mengharuskan database dihapus terlebih dahulu.

Kalau hanya akan menghasilkan conflict, kenapa harus dicommit? Lagipula ini kan autogenerated.

Apabila tidak dicommit, maka sama saja tidak menggunakan fitur automatic migrations! DB migration harus menyimpan semua versi migration serta cara untuk maju atau mundur dari sebuah versi migration. Jika script migration tidak dicommit, maka sama saja hanya ada 1 migration, dengan kata lain tidak dapat mengubah versi migration database.

Setiap kali perintah makemigrations dijalankan, django akan menghasilkan script “migration n” dimana n adalah versi migration. Versi migration yang berlaku pada database pun disimpan pada database agar django tahu script migration mana yang harus dijalankan ketika perintah migrate diesksekusi.

Kegagalan dalam melaksanakan database migration bisa berakibat fatal, yaitu semua data dalam database harus dihapus dan diisi lagi secara manual. Ini lah yang terjadi pada pengembangan aplikasi ConnectDot. Developer membuat kesalahan terkait tata cara migration sehingga semua data dummy harus dihapus. Hal yang membuat ini menjadi parah adalah:

Script automatic database seeding belum siap ketika semua data dummy terpaksa dihapus

Itu terjadi saat sprint review keempat. Sekarang tidak akan terjadi lagi, karena ConnectDot sudah memiliki automatic database seeding untuk mempermudah hidup developer.

Django Automatic Database Seeding

Database seeding adalah proses pengisian data “awal” ke dalam database. Dalam environment development, data yang di-seed adalah data dummy agar backend dan frontend dapat menampilkan sesuatu. Proses ini apabila dilakukan secara manual akan sangat melelahkan, apalagi kalau ada insiden dimana seluruh isi database harus dihapus.

Django tidak menyediakan fitur automatic seeding. Akan tetapi, kita sebagai developer dapat mengimplementasikannya dengan mudah. Cara mudahnya adalah dengan meniru apa yang dilakukan pada unit testing django. Unit testing pada django biasanya melibatkan pengisian data testing pada database test.

Kode pada unit test yang memasukkan data dummy ke database testing

Jika kita meniru apa yang dilakukan pada unit test, maka script seeding akan terlihat seperti berikut.

Tentunya script tersebut tidak dapat dijalankan secara sembarangan seperti python seed.py. Script ini harus dijalankan pada enviroment django. Salah satu caranya adalah dengan membuka django shell, python manage.py shell, lalu script seeding di-import. Tapi hal tersebut harus dilakukan secara manual. Kita dapat menambahkan perintah baru ke dalam project django kita layaknya runserver, migrate, makemigrations, dll. Caranya adalah dengan menyimpan perintah terkait ke dalam folder <nama app>/management/commands/nama_command.py. Kemudian, script harus tersebut harus mengimplementasikan API Command Django.

seed.py

Dengan begini, cara mengeksekusi seed adalah:

python manage.py seed

Script seeding juga sebaiknya selalu menghapus semua seed yang ada sehingga script seeding dapat dieksekusi berulang kali. Karena setiap kali server berjalan perintah migrate juga harus dijalankan dan karena script seeding dapat dieksekusi berulang kali, maka cara menjalankan server adalah sebagai berikut:

python manage.py migrate && python manage.py seed && python manage.py runserver

Pastikan script seeding development berbeda dengan script seeding production!

--

--

Energizer AAA
Energizer AAA

Published in Energizer AAA

We post stories all about an app we develop called ConnectDot.

No responses yet