Ini adalah artikel terakhir dalam seri migrasi Django kami:
- Bagian 1:Migrasi Django - Dasar
- Bagian 2:Menggali Migrasi Lebih Dalam
- Bagian 3:Migrasi Data (artikel saat ini)
- Video:Django 1.7 Migrasi - primer
Kembali lagi.
Migrasi terutama untuk menjaga model data database Anda tetap mutakhir, tetapi database lebih dari sekadar model data. Terutama, ini juga merupakan kumpulan data yang besar. Jadi, diskusi apa pun tentang migrasi database tidak akan lengkap tanpa membahas juga tentang migrasi data.
Diperbarui 12 Februari 2015 :Mengubah migrasi data untuk mencari model dari registri aplikasi.
Migrasi Data Ditetapkan
Migrasi data digunakan dalam beberapa skenario. Dua yang sangat populer adalah:
- Bila Anda ingin memuat “data sistem”, aplikasi Anda bergantung pada keberadaan untuk beroperasi dengan sukses.
- Saat perubahan pada model data memaksa kebutuhan untuk mengubah data yang ada.
Perhatikan bahwa memuat data dummy untuk pengujian tidak ada dalam daftar di atas. Anda dapat menggunakan migrasi untuk melakukannya, tetapi migrasi sering dijalankan di server produksi, jadi Anda mungkin tidak ingin membuat sekumpulan data uji tiruan di server produksi Anda.
Contoh
Melanjutkan dari Proyek Django sebelumnya, sebagai contoh membuat beberapa "data sistem", mari buat beberapa harga bitcoin historis. Migrasi Django akan membantu kita, dengan membuat file migrasi kosong dan meletakkannya di tempat yang tepat jika kita mengetik:
$ ./manage.py makemigrations --empty historical_data
Ini akan membuat file bernama historical_data/migrations/003_auto<date_time_stamp>.py
. Mari kita ubah namanya menjadi 003_load_historical_data.py
dan kemudian membukanya. Anda akan memiliki struktur default yang terlihat seperti:
# encoding: utf8
from django.db import models, migrations
class Migration(migrations.Migration):
dependencies = [
('historical_data', '0002_auto_20140710_0810'),
]
operations = [
]
Anda dapat melihatnya membuat struktur dasar untuk kami, dan bahkan memasukkan dependensi. Itu membantu. Sekarang untuk melakukan beberapa migrasi data, gunakan RunPython
operasi migrasi:
# encoding: utf8
from django.db import models, migrations
from datetime import date
def load_data(apps, schema_editor):
PriceHistory = apps.get_model("historical_data", "PriceHistory")
PriceHistory(date=date(2013,11,29),
price=1234.00,
volume=354564,
total_btc=12054375,
).save()
PriceHistory(date=date(2012,11,29),
price=12.15,
volume=187947,
total_btc=10504650,
).save()
class Migration(migrations.Migration):
dependencies = [
('historical_data', '0002_auto_20140710_0810'),
]
operations = [
migrations.RunPython(load_data)
]
Kita mulai dengan mendefinisikan fungsi load_data
yang - Anda dapat menebaknya - memuat data.
Untuk aplikasi nyata, kami mungkin ingin membuka blockchain.info dan mengambil daftar lengkap harga historis, tetapi kami hanya menempatkan beberapa di sana untuk menunjukkan cara kerja migrasi.
Setelah memiliki fungsi, kita dapat memanggilnya dari RunPython
operasi dan kemudian fungsi ini akan dijalankan ketika kita menjalankan ./manage.py migrate
dari baris perintah.
Perhatikan barisnya:
PriceHistory = apps.get_model("historical_data", "PriceHistory")
Saat menjalankan migrasi, penting untuk mendapatkan versi PriceHistory
kami model yang sesuai dengan titik dalam migrasi tempat Anda berada. Saat Anda menjalankan migrasi, model Anda (PriceHistory
) dapat berubah, jika misalnya Anda menambahkan atau menghapus kolom dalam migrasi berikutnya. Ini dapat menyebabkan migrasi data Anda gagal, kecuali jika Anda menggunakan baris di atas untuk mendapatkan versi model yang benar. Untuk lebih lanjut tentang ini, silakan lihat komentar di sini.
Ini bisa dibilang lebih banyak pekerjaan daripada menjalankan syncdb
dan membuatnya memuat perlengkapan. Faktanya, migrasi tidak menghormati perlengkapan - artinya mereka tidak akan memuatnya secara otomatis untuk Anda seperti syncdb
akan.
Ini terutama karena filosofi.
Meskipun Anda dapat menggunakan migrasi untuk memuat data, ini terutama tentang migrasi data dan/atau model data. Kami telah menunjukkan contoh memuat data sistem, terutama karena ini adalah penjelasan sederhana tentang bagaimana Anda akan menyiapkan migrasi data, tetapi sering kali, migrasi data digunakan untuk tindakan yang lebih kompleks seperti mengubah data Anda agar sesuai dengan model data baru.
Contohnya mungkin jika kami memutuskan untuk mulai menyimpan harga dari beberapa bursa, bukan hanya satu, sehingga kami dapat menambahkan bidang seperti price_gox
, price_btc
, dll, maka kita bisa menggunakan migrasi untuk memindahkan semua data dari price
kolom ke price_btc
kolom.
Secara umum ketika menangani migrasi di Django 1.7, yang terbaik adalah memikirkan memuat data sebagai latihan terpisah dari migrasi basis data. Jika Anda ingin terus menggunakan/memuat perlengkapan, Anda dapat menggunakan perintah seperti:
$ ./manage.py loaddata historical_data/fixtures/initial_data.json
Ini akan memuat data dari perlengkapan ke dalam database.
Ini tidak terjadi secara otomatis seperti halnya migrasi data (yang mungkin merupakan hal yang baik), tetapi fungsinya tetap ada; itu belum hilang, jadi jangan ragu untuk terus menggunakan perlengkapan jika Anda membutuhkannya. Perbedaannya adalah sekarang Anda memuat data dengan perlengkapan saat Anda membutuhkannya. Ini adalah sesuatu yang perlu diingat jika Anda menggunakan perlengkapan untuk memuat data pengujian untuk pengujian unit Anda.
Kesimpulan
Ini, bersama dengan dua artikel sebelumnya, mencakup skenario paling umum yang akan Anda temui saat menggunakan migrasi. Ada lebih banyak skenario, dan jika Anda penasaran dan benar-benar ingin mendalami migrasi, tempat terbaik untuk pergi (selain kode itu sendiri) adalah dokumen resmi.
Ini adalah yang paling mutakhir dan melakukan pekerjaan yang cukup baik untuk menjelaskan cara kerja berbagai hal. Jika ada skenario yang lebih kompleks yang ingin Anda lihat contohnya, beri tahu kami dengan berkomentar di bawah.
Ingat bahwa dalam kasus umum, Anda berurusan dengan:
-
Migrasi Skema: Perubahan struktur database atau tabel tanpa perubahan data. Ini adalah tipe yang paling umum, dan Django secara umum dapat membuat migrasi ini untuk Anda secara otomatis.
-
Migrasi Data: Perubahan data, atau memuat data baru. Django tidak dapat menghasilkan ini untuk anda. Mereka harus dibuat secara manual menggunakan
RunPython
migrasi.
Jadi pilih migrasi yang tepat untuk Anda, jalankan makemigrations
dan kemudian pastikan untuk memperbarui file migrasi Anda setiap kali Anda memperbarui model Anda—dan itu kurang lebih. Itu akan memungkinkan Anda untuk menyimpan migrasi Anda dengan kode Anda di git dan memastikan bahwa Anda dapat memperbarui struktur database Anda tanpa harus kehilangan data.
Selamat bermigrasi!