2013-08-09 1 views
1

Я использую юг миграцию данных для перемещения данных из одной таблицы в другую (между Джанго приложениями)дубликата таблицы (тождественна), включая первичный ключ - с помощью Джанго юга

его скользящим все данными, как это предположит, но, Проблема заключается в том, что он не дублирует первичный ключ (ID), а создает новый (в новой таблице), который имеет смысл.

Но как я могу сделать новую таблицу идентичной, включая поле id (по умолчанию , не определены в моделях)

использование mysql

ответ

2

Создайте таблицу, используя LIKE в части forwards, вставьте все, начиная от старого стола и заканчивая новым. В backwards часть просто отбросит новую таблицу.

def forwards(self, orm): 
    db.execute("CREATE TABLE new_table LIKE old_table") 
    db.execute("INSERT new_table SELECT * old_table") 

def backwards(self, orm): 
    db.drop_table('new_table') 

Надеюсь, что это поможет.

+0

СММ, когда мы используем «LIKE» занимают заботы ForeignKey и отдельных таблиц в случае ManyToManyField? – Peter

+0

Я боюсь, что он не создаст отдельные таблицы для ManyToMany. Внешние ключи копируются как есть. – alecxe

+0

, используя «LIKE», работал для моего дела. – Peter

1

Есть два основных способа сделать то, что вы хотите сделать:

  1. Написать многоступенчатый миграции в.
  2. Цикл через строки и набор идентификаторов.

Я думаю, что второе проще, хотя я не уверен, что вы пытаетесь сделать. Если вы уже писать что-то вроде

for a in A.objects.all(): 
    b = B(attr1 = a.attr1, ...) 
    b.save() 

, то вы не можете просто написать

b = B(id = a.id, attr1 = a.attr1, ...) 

Если вы используете более автоматический способ копирования ваших строк, рассмотрим многоэтапный подход к миграции: 1. Напишите модели а и в, как так:

class A(model): 
     real_data = CharField() 
    class B(model): 
     real_data = CharField() 
     fake_id = IntegerField(primary_key=True) 
     id = IntegerField() 
  1. Написать datamigration копирование а до б
  2. Написать schemamigration делает B.id в primary_key и удаление fake_id
+0

hmm "b = B (id = a.id, attr1 = a.attr1, ...)" должен работать, я этого не пробовал! Я в конечном итоге использую LIKE в соответствии с ответом @alecxe. – Peter

 Смежные вопросы

  • Нет связанных вопросов^_^