Automatic Data Seeding and Migration in Django

Ali Irsyaad Nursyaban
5 min readJun 7, 2021

--

Migration

Migration adalah cara aplikasi django mencatat / menyebarkan perubahan yang telah buat pada model (perubahan field / atribut, menghapus model, dll) ke dalam skema basis data. Migration dicatat ke dalam bentuk file python secara otomatis yang biasa disebut migration file. Migration file untuk setiap apps django project disimpan pada direktori migrations di dalam direktori apps tersebut, dirancang seperti commit pada git, dan didistribusikan sebagai bagian dari code apps.

Pada Django cara membuat migration secara otomatis adalah dengan command:

python manage.py makemigrations [nama apps]

Contoh melakukan perubahan pada models koperasi proyek PPL Laywook dan melakukan migration:

models.py
makemigrations execution

Setelah melakukan migration akan otomatis terbuat migrations file python pada direktori migrations:

direktori migrations
Isi file 0003_auto_20210608_0457.py (migration file)

Dapat terlihat migration file tersebut terlihat seperti operasi-operasi pada relational database, dan memang bisa dianalogikan seperti penerjemahan bahasa “database” kedalam bahasa python. Secara default django membuat penamaan file dengan increasing number namun dapat diubah penamaan migration file untuk lebih lengkapnya dapat dibaca pada artikel berikut here.

Perlu diingat pembuatan secara otomatis migration file tidak mengubah database aplikasi, melainkan hanya menyimpan perubahan/penambahan yang siap untuk dibuat pada database aplikasi. Cara menerapkan perubahan (migration file) tersebut pada database aplikasi dengan command:

python manage.py migrate [nama_apps]
migrate execution

Setelah melakukan command tersebut maka database aplikasi sudah berubah dan dapat dicek ulang pada database aplikasi (MySQL, Postgresql, SQLite, dll) sesuai dengan database yang diimplementasikan.

Seeding

sumber: https://www.memecreator.org/meme/data-or-seed-data-is-seed-its-a-data-its-a-seed/

Seeding adalah proses memberikan data sementara (dummy) untuk percobaan (testing) fungsionalitas pada database aplikasi. Data tersebut hanya digunakan pada proses development suatu aplikasi, dan sebisa mungkin data tersebut merepresentasikan data sebenarnya, misal: data transaksi meliputi nominal rupiah yang sesuai, dan tipe transaksi yang mirip dengan data asli nantinya. Sebelum melakukan seeding pastikan bahwa database sudah ada dan spesifikasi model sudah tepat.

Pada aplikasi django, seeding dapat dilakukan dengan berbagai cara antara lain membuat file sql atau python code secara manual, dumpdata dan loadata berbentuk fixtures, atau menggunakan library external sebagai contoh django-seed. Pada artikel ini akan dibahas menggunakan python code secara manual, dumpdata dan loadata berbentuk fixtures, dan django-seed.

Manual Python Code

Seeding dengan cara ini sangat intuitif dan fleksibel, hanya dengan membuat dua atau lebih python code yang pertama file untuk seeding (seed_up.py) dan kedua untuk menghapus data hasil seeding tersebut (seed_down.py) *penamaan file bebas. Implementasi file seed_up.py hanya perlu membuat object pada model yang ingin di seed lalu save object tersebut. Sementara untuk file seed_down.py cukup menghapus seluruh/sebagian object pada suatu model. Contoh seeding menggunakan manual python code pada proyek PPL Laywook:

seed_up.py : Seeding model Transaction dan Method
seed_down.py

Terlihat pada program diatas intinya hanya perlu membuat object lalu save. Untuk mengeksekusi program seed_up.py dengan command:

python manage.py shell < [nama_file/seed_up.py/seed_down.py]

Dumpdata dan Loadata berbentuk fixtures

Seeding dengan cara ini memerlukan data dummy yang sudah ada pada database, data dummy tersebut dapat dimasukkan secara manual menggunakan file sql, django admin, atau python code pada cara seeding sebelumnya. Intinya cara seeding ini adalah menyimpan data yang sudah ada, dalam bentuk lain yang dinamakan fixtures bisa berbentuk JSON atau XML file dengan menggunakan command:

python manage.py dumpdata [nama_apps].[nama_model] [OPTIONAL --indent 4] > [file_json/xml]

*Optional tersebut untuk membuat file json/xml mudah dibaca.

Contoh misal sudah terdapat data dari cara pertama seeding manual python code lalu ingin dumpdata tersebut kedalam bentuk json yang disimpan dalam direktori seed :

dumpdata execution

Maka akan terbuat json file seperti berikut :

Contoh file json hasil dumpdata

File json tersebut nantinya digunakan untuk seed database aplikasi. Caranya dengan command:

python manage.py loaddata [file_json/xml]
loaddata execution

Maka data dari fixtures / file json tersebut akan diterjemahkan serta disimpan dalam database. Contoh kasus penggunaan misal bekerja dalam tim developer dan menggunakan database lokal masing-masing anggota tim. Maka hanya perlu mengirimkan fixtures tersebut dan loaddata pada masing-masing komputer lokal, dan seeding pun berhasil.

Untuk mempermudah proses dumpdata dan loaddata dapat diimplementasikan bash file seperti berikut:

bash file untuk dumpdata
bash file untuk loaddata

Automatic Data Seeding Django-Seed

Seeding cara ini mungkin lebih mudah, namun membutuhkan library external dan beberapa konfigurasi lainnya. Pertama-tama install library django-seed dengan command:

pip install django-seed
django-seed installation

Lalu tambahan pada INSTALLED_APPS pada settings.py :

menambahkan django-seed pada settings.py

Berbeda dengan cara seeding sebelumnya, pada cara ini tidak diperlukan membuat object lalu save secara manual, melainkan secara otomatis menggunakan database faker pada library external. Berikut contoh command untuk seeding pada suatu apps .

python manage.py seed [nama_apps] --number=[jumlah_data_dummy]

Contoh seeding data dummy pada apps koperasi yang didalamnya terdapat model FinancialKoperasi:

FinancialKoperasi model
django-seed execution

Dikarenakan model FinancialKoperasi memiliki foreignkey ke model Category maka akan diseed pula model Category tersebut.

Hasil data seeding model Category
Hasil data seeding model FinancialKoperasi

Dan terlihat data dummy pada model Category tidak merepresentasikan data sebenarnya, dan tentu ini dapat dikonfigurasi lebih lanjut. Untuk lebih lengkapnya dapat dilihat pada github django-seed berikut here.

Setiap cara seeding memiliki kelemahan dan kelebihannya dari segi flexibilitas dan kecepatan. Jadi sesuaikan dengan kebutuhan dari aplikasi masing-masing.

Referensi

--

--