Untuk proyek di Django saya harus menggunakan dua database: default dan remote . Saya telah membuat routers.py
dan semuanya berfungsi dengan baik.
Ada persyaratan untuk membuat tabel di basis data jauh dan saya membuat migrasi, jalankan, dan tabel django_migrations
itu dibuat. Saya ingin hanya memiliki satu tabel django_migrations
, dalam database default.
Bagian yang relevan routers.py
ada di sini:
class MyRouter(object):
# ...
def allow_migrate(self, db, app_label, model_name=None, **hints):
if app_label == 'my_app':
return db == 'remote'
return None
Saya menjalankan migrasi seperti ini:
python manage.py migrate my_app --database=remote
Sekarang ketika saya melakukannya:
python manage.py runserver
Saya mendapatkan peringatan berikut:
Anda memiliki 1 migrasi yang tidak diterapkan. Proyek Anda mungkin tidak berfungsi dengan baik sampai Anda menerapkan migrasi untuk aplikasi: my_app.
Jalankan 'python manage.py migrate' untuk menerapkannya.
Tabel untuk my_app
dibuat di remote
database, dan di django_migrations
dalam remote
database migrasi ditandai sebagai diterapkan.
EDIT:
Bagaimana cara memaksa Django untuk menggunakan hanya satu tabel django_migrations
, tetapi masih menerapkan migrasi ke database yang berbeda?
Bagaimana cara menerapkan migrasi di berbagai basis data sehingga tidak ada peringatan yang dimunculkan?
sumber
django_migrations
tabel bersama , akan diperlukan untuk membedakan antara baris dengan migrasi untukdefault
danremote
db. Ini cukup dalam di internal Django. Saya bahkan akan mengambil risiko menyatakan bahwa itu akan memerlukan penulisan ulang kode migrasi.Jawaban:
Berkat komentar pada pertanyaan saya, saya melakukan riset dan menghasilkan temuan berikut.
Menggunakan banyak basis data menghasilkan pembuatan tabel
django_migrations
saat migrasi digunakan. Tidak ada pilihan untuk mencatat migrasi hanya dalam satu tabeldjango_migrations
, seperti komentar dari Kamil Niski menjelaskan. Ini jelas setelah membaca filedjango/db/migrations/recorder.py
.Saya akan menggambarkan contoh dengan proyek
foo
dan aplikasibar
di dalam proyek. Aplikasibar
ini hanya memiliki satu modelBaz
.Kami membuat proyek:
Sekarang kita memiliki konten ini di dalam direktori proyek utama:
Saya memiliki kebiasaan untuk mengelompokkan semua aplikasi di dalam direktori proyek:
Dalam file tersebut
foo/settings.py
kami menyesuaikan pengaturan untuk menggunakan dua database yang berbeda, untuk keperluan contoh ini kami menggunakansqlite3
:Sekarang kami menjalankan migrasi:
Ini menjalankan semua migrasi, bagian
--database=default
itu opsional, karena jika tidak ditentukan Django menggunakan database default.Django telah menerapkan semua migrasi ke database default:
Sekarang kami membuat model
Baz
:models.py
:daftarkan aplikasinya
bar
keINSTALLED_APPS
(foo/settings.py
) dan buat themigrations:Sebelum kami menjalankan migrasi yang kami buat
routers.py
di dalambar
aplikasi:dan daftarkan di
foo/settings.py
:Sekarang pendekatan naif adalah menjalankan migrasi
bar
ke dalamremote
database:Migrasi telah diterapkan ke
remote
database:Ketika kami menjalankan:
peringatan berikut akan dimunculkan:
Segalanya tampak bekerja dengan baik. Namun tidak memuaskan memiliki peringatan ini.
Cara yang tepat adalah menjalankan semua migrasi untuk setiap basis data seperti yang disarankan dalam jawaban ini .
Akan terlihat seperti ini:
dan setelah membuat migrasi untuk
bar
:Router akan berhati-hati bahwa tabel
bar_baz
dibuat hanya dalamremote
database, tetapi Django akan menandai migrasi sebagaimana diterapkan di kedua database. Juga tabel untukauth
,admin
,sessions
, dll akan dibuat hanya dalamdefault
basis data, sebagaimana ditentukan dalamrouters.py
. Tabeldjango_migrations
dalamremote
database akan memiliki catatan untuk migrasi ini juga.Ini adalah bacaan yang panjang, tapi saya harap ini menjelaskan hal ini, menurut pendapat saya, tidak menjelaskan masalah secara menyeluruh dalam dokumentasi resmi .
sumber