Uploading files
This commit is contained in:
76
move_db.py
Normal file
76
move_db.py
Normal file
@@ -0,0 +1,76 @@
|
||||
# The following code is tested on Django 1.7
|
||||
import django
|
||||
import sys
|
||||
import logging
|
||||
|
||||
from django.apps import apps
|
||||
from django.db.migrations.recorder import MigrationRecorder
|
||||
if django.get_version() > '1.7':
|
||||
from django.core.serializers import sort_dependencies
|
||||
else:
|
||||
from django.core.management.commands.dumpdata import sort_dependencies
|
||||
|
||||
|
||||
LOG_FORMAT = '%(asctime)s|%(levelname)s|%(message)s'
|
||||
logging.basicConfig(stream=sys.stdout, level=logging.INFO, format=LOG_FORMAT)
|
||||
logger = logging.getLogger(__name__)
|
||||
|
||||
|
||||
def copy(model):
|
||||
table_name = model._meta.db_table
|
||||
logger.info('Start import %s into slave' % table_name)
|
||||
|
||||
table_objects = model.objects.all()
|
||||
for t in table_objects:
|
||||
t.save(using='slave')
|
||||
|
||||
logger.info('Successfuly imported %s into slave' % table_name)
|
||||
|
||||
'''
|
||||
Please note that the id for many to many objects might be diffrent from source table.
|
||||
This is because id is not specified in the add method.
|
||||
'''
|
||||
def copy_m2m(model, m2m_field):
|
||||
table_name = m2m_field.rel.through._meta.db_table
|
||||
field_name = m2m_field.name
|
||||
to_model = m2m_field.rel.to
|
||||
pk_name = model._meta.pk.name
|
||||
child_pk_name = to_model._meta.pk.name
|
||||
|
||||
logger.info('Start import %s into slave' % table_name)
|
||||
|
||||
for o in model.objects.all():
|
||||
pk_value = getattr(o, pk_name)
|
||||
new_o = model.objects.using('slave').get(**{pk_name: pk_value})
|
||||
for child in getattr(o, field_name).all():
|
||||
child_pk_value = getattr(child, child_pk_name)
|
||||
new_child = to_model.objects.using('slave').get(**{child_pk_name: child_pk_value})
|
||||
getattr(new_o, field_name).add(new_child)
|
||||
|
||||
logger.info('Successfuly imported %s into slave' % table_name)
|
||||
|
||||
|
||||
def run():
|
||||
logger.info('Start move data into slave')
|
||||
|
||||
app_configs = apps.get_app_configs()
|
||||
app_list = [(a, None) for a in app_configs]
|
||||
models = sort_dependencies(app_list)
|
||||
models_with_m2m = []
|
||||
|
||||
for m in models:
|
||||
copy(m)
|
||||
if m._meta.many_to_many:
|
||||
models_with_m2m.append(m)
|
||||
|
||||
# Migration model needs to copy separately as it is not in the INSTALLED_APPS
|
||||
copy(MigrationRecorder.Migration)
|
||||
|
||||
# re-create object in ManyToManyField
|
||||
for m in models_with_m2m:
|
||||
for field in m._meta.many_to_many:
|
||||
# data for field that has specific through model should have been copied in earlier steps
|
||||
if field.rel.through._meta.auto_created:
|
||||
copy_m2m(m, field)
|
||||
|
||||
logger.info('Successfully moved data into slave')
|
||||
Reference in New Issue
Block a user