Automatic Data Seeding/Migration

Rizal Diantoro
Sulang
Published in
4 min readMay 3, 2018

Bagaimana cara kami membuat automatic Data Seeding/Migration pada apps suling?. Mari kita bahas.

Kami sudah melakukan seeding kedalam aplikasi dan memasukkan ribuan data hanya dalam sekejap.

Seeding in Django

Django sudah menyediakan dokumentasi yang lengkap untuk berbagai kebutuhan, salah satunya adalah cara untuk provide initial database atau yang lebih umum dikenal dengan seeding. Dokumentasi tentang seeding di Django sendiri dapat dilihat pada link berikut ini https://docs.djangoproject.com/en/2.0/howto/initial-data/.

Terdapat dua command penting untuk dapat melakukan hal tersebut di Django.

  1. python manage.py dumpdata
    Perintah ini kita jalankan untuk mengenerate database yang sudah ada kedalam file json.

Hasilnya adalah sebuah file json bernama jobs.json, yang berisikan data seperti berikut ini:

[
{
"model": "lowongan.job",
"pk": 1,
"fields": {
"perusahaan": 1,
"position": "Backend Engineer",
"location": "Slipicon Valley",
"description": "Ngoding Kuy",
"created_at": "2018-05-02T13:55:51.322Z"
}
},
{
"model": "lowongan.job",
"pk": 2,
"fields": {
"perusahaan": 1,
"position": "Frontend Engineer",
"location": "Slipicon Valley",
"description": "Design Kuy",
"created_at": "2018-05-02T13:55:51.400Z"
}
},
{
"model": "lowongan.job",
"pk": 3,
"fields": {
"perusahaan": 2,
"position": "Backend Engineer",
"location": "Kuningan",
"description": "Ngoding Kuy",
"created_at": "2018-05-02T13:55:51.478Z"
}
},
{
"model": "lowongan.job",
"pk": 4,
"fields": {
"perusahaan": 2,
"position": "Frontend Engineer",
"location": "Kuningan",
"description": "Design Kuy",
"created_at": "2018-05-02T13:55:51.567Z"
}
}
]

2. python manage.py loaddata

Sedangkan perintah ini dilakukan ketika ingin memindahkan data pada file json tadi kedalam database.

Lalu bagaimana Suling mendapatkan data-data untuk dijadikan initial data?

Kami menggunakan https://mockaroo.com/ untuk mengenerate data dan mendownloadnya kedalam file json.

Kira-kira seperti ini tampilan dari mockaroo untuk dapat mengerate data untuk model jobs tadi. Lalu kita hanya perlu mendownload datanya. Dan seperti ini hasilnya:

[{
"perusahaan": 1,
"position": "Editor",
"location": "Portugal",
"description": "Obstruction due to foreign body accidentally left in body following kidney dialysis, sequela",
"created_at": "2017-09-27T09:08:29Z"
}, {
"perusahaan": 2,
"position": "Software Test Engineer II",
"location": "Uzbekistan",
"description": "External constriction of left hand",
"created_at": "2017-09-10T14:58:56Z"
}, {
"perusahaan": 3,
"position": "Director of Sales",
"location": "Cameroon",
"description": "Displaced fracture of lateral cuneiform of right foot, subsequent encounter for fracture with malunion",
"created_at": "2017-09-20T09:59:36Z"
}, {
"perusahaan": 4,
"position": "Electrical Engineer",
"location": "Netherlands",
"description": "Juvenile osteochondrosis of spine",
"created_at": "2017-05-16T08:48:52Z"
}, {
"perusahaan": 5,
"position": "Sales Representative",
"location": "Myanmar",
"description": "Unspecified open wound of left back wall of thorax with penetration into thoracic cavity, sequela",
"created_at": "2018-02-18T05:43:20Z"
}]

Lalu untuk menyesuaikan dengan model yang kita punya, saya membuat helper.

import json
datas = json.load(open('jobs_mock.json'))
result = []count = 1for data in datas: result_tmp = {} result_tmp['model'] = "lowongan.job" result_tmp["pk"] = count result_tmp["fields"] = data count = count + 1 result.append(result_tmp)with open('jobs.json', 'w') as outfile:
json.dump(result, outfile, indent=4)

Dan ini hasilnya akan menjadi seperti ini

[
{
"model": "lowongan.job",
"pk": 1,
"fields": {
"perusahaan": 1,
"position": "Editor",
"location": "Portugal",
"description": "Obstruction due to foreign body accidentally left in body following kidney dialysis, sequela",
"created_at": "2017-09-27T09:08:29Z"
}
},
{
"model": "lowongan.job",
"pk": 2,
"fields": {
"perusahaan": 2,
"position": "Software Test Engineer II",
"location": "Uzbekistan",
"description": "External constriction of left hand",
"created_at": "2017-09-10T14:58:56Z"
}
},
{
"model": "lowongan.job",
"pk": 3,
"fields": {
"perusahaan": 3,
"position": "Director of Sales",
"location": "Cameroon",
"description": "Displaced fracture of lateral cuneiform of right foot, subsequent encounter for fracture with malunion",
"created_at": "2017-09-20T09:59:36Z"
}
},
{
"model": "lowongan.job",
"pk": 4,
"fields": {
"perusahaan": 4,
"position": "Electrical Engineer",
"location": "Netherlands",
"description": "Juvenile osteochondrosis of spine",
"created_at": "2017-05-16T08:48:52Z"
}
},
{
"model": "lowongan.job",
"pk": 5,
"fields": {
"perusahaan": 5,
"position": "Sales Representative",
"location": "Myanmar",
"description": "Unspecified open wound of left back wall of thorax with penetration into thoracic cavity, sequela",
"created_at": "2018-02-18T05:43:20Z"
}
}
]

Lalu yang terakhir adalah bagaimana caranya membuat sembuat ini menjadi otomatis pada saat deployment.

Kami menggunakan docker based dalam melakukan deployment. Dan kami memiliki satu file entrypoint yang akan dijalankan untuk menjalankan aplikasi. Semua yang perlu kami jalankan secara otomatis dapat kami lakukan disana.

docker-compose.yml

version: '3'services:
web1:
restart: always
build: ./backend/v1/
volumes:
- ./backend/v1/:/data/web
entrypoint:
- ./run.sh
ports:
- "${PORT_BE_V1}:8001"
web2:
restart: always
build: ./frontend/v1/
volumes:
- ./frontend/v1/:/data/web2
entrypoint:
- ./run.sh
ports:
- "${PORT_FE_V1}:8000"
web3:
restart: always
build: ./frontend/v2/
volumes:
- ./frontend/v2/:/data/web3
entrypoint:
- ./run.sh
ports:
- "${PORT_FE_V2}:8002"

Dan berikut adalah script runner kami.

#!/bin/sh
python3 manage.py makemigrations
python3 manage.py migrate
python3 manage.py populate_db
python3 manage.py loaddata */fixtures/*.json
/usr/bin/gunicorn hound.wsgi:application -w 2 -b :8001

Script diatas melakukan

  1. Migrasi database
  2. Seeding database
  3. Menjalankan server Django menggunakan gunicorn

Terimakasih

--

--