Database
 sql >> Teknologi Basis Data >  >> RDS >> Database

Migrasi Data

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:

  1. Bila Anda ingin memuat “data sistem”, aplikasi Anda bergantung pada keberadaan untuk beroperasi dengan sukses.
  2. 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:

  1. 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.

  2. 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!



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Model Data Catur 3D Star Trek

  2. Bersenang-senang dengan kompresi (penyimpanan kolom) di atas meja yang sangat besar – bagian 3

  3. Bagaimana Nomor Lantai di SQL

  4. Tutorial PL/SQL :Semua yang Perlu Anda Ketahui Tentang PL/SQL

  5. Berapa Gaji Rata-Rata Pengembang SQL?