Django - Sincronizzazione dei dati tra più database
-
23-12-2019 - |
Domanda
su un ambiente multi-database, come spostare tutti i dati da un database a un altro?
Impostazioni Sembra questo:
DATABASES = {
'default': {},
'users': {
'NAME': 'user_data',
'ENGINE': 'django.db.backends.sqlite3',
'USER': 'user',
'PASSWORD': 'superS3cret'
},
'customers': {
'NAME': 'customer_data',
'ENGINE': 'django.db.backends.postgresql_psycopg2',
'USER': 'cust',
'PASSWORD': 'veryPriv@ate'
}
}
.
C'è qualche soluzione / app semplice per farlo?Sebbene sia sufficiente una migrazione a senso unico, poiché ci sono dozzine di modelli e oggetti con chiavi stranieri complessi e connessioni a molti a molti, iterazioni su modelli e oggetti e salvarli in un altro non risolvono il mio problema.
loaddata
non riesce anche in caso di creazione dell'oggetto utilizza i segnali per creare oggetti di novità e questo incasinare tasti univoci.
L'utilizzo di Dumps SQL non è banale, poiché i backend sono diversi.Ho provato questo, non ho potuto riuscire a creare Dumps PSQL dal mio database SQLite3, che non rovina le chiavi straniere.
Quindi ho bisogno di una soluzione, che carica i dati da un database a un altro, ma non invia anche segnali e funziona anche con tasti estranei.Ma non ho potuto trovare nulla che faccia questo.
Soluzione
Finalmente sono riuscito a risolverlo.
Ho creato tabelle usando
manage.py syncdb --all
manage.py migrate --fake
.
Loading Dumps con loaddata
non ha funzionato a causa di problemi di integrità.(Vincoli chiave stranieri rotti, ad esempio)
Quindi ho dovuto modificare i miei tavoli.Ho rimosso i vincoli rotti, e poi ho potuto correre loaddata
senza problemi.
Tuttavia, ovviamente il mio database era ancora rotto da quando ho lasciato cadere un paio di vincoli.Pertanto, dovevo semplicemente modificare di nuovo le mie tabelle, usando psql
Shell.
PGAdmin è stato utile, poiché mostra le query Dump pertinenti su un'interfaccia user-friendly, separatamente per ciascun vincolo.
Altri suggerimenti
Scriviamo solo uno script Python per Migrare l'istanza da un database a un altro , eseguire quello script usando django-estensioni runscript
Ad esempio
# Move Foo table data from one to another
for each_foo in Foo.objects.using("users").all():
# _create foo instance in customer_data
foo_obj, status = Foo.objects.using("customers").get_or_create(
foo_name=each_foo.foo_name,
foo_code=each_foo.foo_code)
.