Menyiapkan Data untuk Production

Yudistira Hanifmuti
PPL Teman Bisnis
Published in
4 min readApr 30, 2019
Image result for image of django data migration

Bertemu kembali dengan saya, Yudistira. Pada kesempatan kali ini, saya ingin berbagi cerita bagaimana data yang digunakan di aplikasi tim A1 disiapkan dan digunakan. Saya juga akan membahas mengenai migration dan bagaimana seharusnya aplikasi melakukan data migration.

Data Migration

Sebelum kita membicarakan soal data migration, mari kita bahas terlebih dahulu migration itu sendiri.

Migration yang disinggung di sini adalah migrasi perubahan pada skema database (DB). Migrasi dilakukan karena terjadi perubahan pada skema DB, seperti ada field baru pada model/tabel atau ada model yang dihapus. Migrasi harus dilakukan supaya kondisi DB pada aplikasi konsisten untuk setiap environment yang sedang berjalan.

Migration pada Django

Seperti yang sudah disinggung pada tulisan sebelumnya, aplikasi kami menggunakan framework Django. Django sudah menyiapkan cara untuk melakukan migration secara otomatis (atau hampir!).

Berikut langkah-langkah yang perlu dilakukan dengan contoh dari aplikasi yang sedang kami kerjakan. Skenarionya adalah saya memiliki models.py seperti di bawah ini dan saya sudah melakukan beberapa perubahan.

Perubahan yang dilakukan adalah normalisasi dari yang awalnya hanya model Event saja menjadi dipisah ada model UserEvent. (Kondisi awal adalah semua atribut di UserEvent ada di Event semua.)

Hal yang dilakukan untuk menerapkan migrasi atau perubahan yang dilakukan adalah dengan menjalankan perintah python manage.py makemigrations. Hasil dari pemanggilan perintah di atas adalah sebuah file migrations yang secara otomatis dibuat oleh Django dan terletak di dalam folder aplikasi (aplikasi kami bernama api).

File paling baru yang terbuat adalah file 0005 yang menunjukkan migrasi ke berapa yang sudah dilakukan pada aplikasi Django ini. Terlihat bahwa migrasi yang dilakukan adalah membuat model baru bernama UserEvent.

Eits, sampai sini belum migrations lho …

Perintah makemigrations di atas baru membuat file migrations nya saja. Untuk menerapkan migrations tersebut, ada perintah satu lagi yang perlu dipanggil yaitu python manage.py migrate. Setelah memanggil perintah tersebut baru migrasi dijalankan.

Script pada Docker Image

Pada PPL tahun ini, kami menggunakan Docker Image sebagai “package” untuk digunakan. Untuk menjamin bahwa aplikasi pada image juga memiliki kondisi DB yang konsisten, perintah migrasi di atas harus dijalankan setiap aplikasi mulai berjalan.

Pada setiap image kami (baik backend maupun frontend), terdapat entry point sebagai script yang harus dijalankan ketika container baru dinyalakan.

Isi dari script tersebut seperti yang bisa anda tebak adalah perintah yang dijelaskan pada poin sebelumnya.

Data Seeding

Setelah kita mengetahui bagaimana migration dilakukan, sekarang kita akan mengisi data dengan teknik data seeding.

Data seeding adalah mengisi database dengan data awal supaya dapat digunakan, baik untuk operasional aplikasinya atau memang sudah merupakan data awal. Banyak teknik yang bisa dilakukan untuk melakukan data seeding. Django sendiri juga menyediakan banyak cara untuk melakukan data seeding.

Django Command

Saya akan mencontohkan cara yang paling sederhana untuk mengisi data, yaitu dengan command python. Pada kelompok kami, data Event perlu diisi terlebih dahulu karena perlu ada list-list nama Event sebelum aplikasi berjalan.

Membuat file populate_db.py seperti direktori di bawah ini.

api
├── admin.py
├── __init__.py
├── management
│ ├── commands
│ │ ├── __init__.py
│ │ └── populate_db.py
│ └── __init__.py
├── models.py
... other files

Lalu, tulis di dalam file populate_db.py class command yang sudah disediakan oleh Django.

from django.core.management.base import BaseCommand
from api.models import Event

class Command(BaseCommand):
args = '<foo bar ...>'
help = 'our help string comes here'

def _create_events(self):
event = Event(eid=1, event_type='register')
event.save()

event = Event(eid=1, event_type='login')
event.save()

def handle(self, *args, **options):
self._create_events()

Setelah itu cukup panggil perintah di bawah.

python manage.py populate_db

Data Event sudah masuk ke DB! Sehingga API dapat digunakan secara baik.

Saya rasa tulisan ini sudah cukup. Sampai jumpa di tulisan saya yang berikutnya. Semoga bermanfaat. Terima kasih.

Bye

— Muhammad Yudistira Hanifmuti

Referensi

--

--