Как упростить миграцию в Django 1.7?

Уже есть похожие вопросы для Юга, но я начал свой проект с Django 1.7 и не использовал Юг.

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

Каков рекомендуемый способ сделать это?

EDIT: с Django 1.8 появилась новая команда под названием squashmigrations, которая более или менее решает проблему, описанную здесь.

Ответ 1

В версии миграции Django 1.7 функциональность reset, которая раньше была на Юге, была отброшена в пользу новых функций для "раздавливания" ваших миграций. Это должно быть хорошим способом контролировать количество проверок.

https://docs.djangoproject.com/en/dev/topics/migrations/#squashing-migrations

Если вы все еще хотите начать с нуля, я предполагаю, что вы все еще можете, опуская таблицу миграции и удалив миграцию, после чего вы снова запустите makemigrations.

Ответ 2

Я получил это. Я просто понял это, и это хорошо.

./manage.py migrate --fake <app-name> zero

Ответ 3

У меня была такая же проблема. Здесь мой способ обхода.

#!/bin/sh
echo "Starting ..."

echo ">> Deleting old migrations"
find . -path "*/migrations/*.py" -not -name "__init__.py" -delete
find . -path "*/migrations/*.pyc"  -delete


# Optional
echo ">> Deleting database"
find . -name "db.sqlite3" -delete

echo ">> Running manage.py makemigrations"
python manage.py makemigrations

echo ">> Running manage.py migrate"
python manage.py migrate

echo ">> Done"

Команда find: http://unixhelp.ed.ac.uk/CGI/man-cgi?find

Ответ 4

Предполагая, что это ваша структура проекта,

project_root/
    app1/
        migrations/
    app2/
        migrations/
    ...
    manage.py
    remove_migrations.py

вы можете запустить script remove_migrations.py из указанного выше места, чтобы удалить все файлы миграции.

#remove_migrations.py
"""
Run this file from a Django =1.7 project root. 
Removes all migration files from all apps in a project.
""" 
from unipath import Path

this_file = Path(__file__).absolute()
current_dir = this_file.parent
dir_list = current_dir.listdir()

for paths in dir_list:
    migration_folder = paths.child('migrations')
    if migration_folder.exists():
        list_files = migration_folder.listdir()
        for files in list_files:
            split = files.components()
            if split[-1] != Path('__init__.py'):
                files.remove()

Удаление вручную может быть утомительным, если у вас есть сложный проект. Это сэкономило мне много времени. Удаление файлов миграции безопасно. Я сделал это несколько раз, не сталкиваясь с какими-либо проблемами... пока.

Однако, когда я удалил папку миграции, makemigrations или migrate не создали папку для меня. script гарантирует, что папка переноса с ее __init__.py остается, только удаляя файлы миграции.

Ответ 5

  • Удалить файлы: delete_migrations.py(в корневом каталоге prj):
import os

for root, dirs, files in os.walk(".", topdown=False):
  for name in files:
      if '/migrations' in root and name != '__init__.py':
          os.remove(os.path.join(root, name))
  1. DELETE FROM django_migrations Where app in ('app1', 'app2');

  2. ./manage.py makemigrations

  3. ./manage.py migrate --fake

ИЛИ, вы можете написать миграцию из этого всего

Ответ 6

Я пробую разные команды, и некоторые ответы помогают мне. Только эта последовательность в моем случае фиксировала как поврежденные зависимости при миграции в MYAPP, так и чистую все прошлые миграции, начиная с нуля.

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

rm -Rf MYAPP/migrations/*
python manage.py makemigrations --empty MYAPP
python manage.py makemigrations
python manage.py migrate --fake MYAPP 0002

Где 0002 - номер миграции, возвращаемый последней командой makemigrations.

Теперь вы можете снова запустить makemigrations/migrate снова, потому что миграция 0002 сохраняется, но не отражается в уже синхронизированной базе данных.

Ответ 7

Если вам не нравятся предыдущие миграции, как просто удалить все миграции в каталоге migrations/? вы начнете миграционную последовательность с нуля, взяв текущую модель в качестве ссылки, как если бы вы написали всю модель сейчас.

Если вы не доверяете мне достаточно, чтобы удалить, тогда попробуйте переместить их.

Ответ 8

Простым способом является

Перейдите в каждое приложение и удалите файлы миграции.

Затем перейдите в таблицу django-migrtaions в базе данных и обрезайте ее (удалите все записи).

После этого вы можете снова создать миграцию.

Ответ 9

каталог cd в src cd /path/to/src

удалить каталоги миграции rm -rf your_app/migrations/

обратите внимание, что это нужно делать для каждого приложения отдельно

мигрирует python3.3 manage.py migrate

если вы хотите начать снова python3.3 manage.py makemigrations your_app

Ответ 10

Если вы находитесь в режиме разработки, и просто хотите reset все (база данных, миграция и т.д.), я использую этот script на основе ответа Abdelhamid Ba. Это приведет к уничтожению таблиц базы данных (Postgres), удалению всех файлов миграции, повторному запуску миграции и загрузке моих первоначальных настроек:

#!/usr/bin/env bash
echo "This will wipe out the database, delete migration files, make and apply migrations and load the intial fixtures."

while true; do
    read -p "Do you wish to continue?" yn
    case $yn in
        [Yy]* ) make install; break;;
        [Nn]* ) exit;;
        * ) echo "Please answer yes or no.";;
    esac
done

echo ">> Deleting old migrations"
find ../../src -path "*/migrations/*.py" -not -name "__init__.py" -delete

# Optional
echo ">> Deleting database"
psql -U db_user -d db_name -a -f ./reset-db.sql

echo ">> Running manage.py makemigrations and migrate"
./migrations.sh

echo ">> Loading initial fixtures"
./load_initial_fixtures.sh

echo ">> Done"

reset -db.sql файл:

DO $$ DECLARE
    r RECORD;
BEGIN
    -- if the schema you operate on is not "current", you will want to
    -- replace current_schema() in query with 'schematodeletetablesfrom'
    -- *and* update the generate 'DROP...' accordingly.
    FOR r IN (SELECT tablename FROM pg_tables WHERE schemaname = current_schema()) LOOP
        EXECUTE 'DROP TABLE IF EXISTS ' || quote_ident(r.tablename) || ' CASCADE';
    END LOOP;
END $$;

файл mig.sh:

#!/usr/bin/env bash
cd ../../src
./manage.py makemigrations
./manage.py migrate

load_initial_fixtures.sh файл:

#!/usr/bin/env bash
cd ../../src
./manage.py loaddata ~/path-to-fixture/fixture.json

Просто не забудьте изменить пути, соответствующие вашему приложению. Я лично имею эти сценарии в папке с именем project_root/ script/local, а источники django находятся в файле project_root/src.

Ответ 11

После удаления каждой папки "миграции" в моем приложении (вручную) я побежал:

./manage.py dbshell
delete from django_migrations;

Тогда я подумал, что могу просто сделать ./manage.py makemigrations, чтобы восстановить их все. Однако никаких изменений не обнаружено. Затем я попытался указать одно приложение за раз: ./manage.py makemigrations foo, ./manage.py makemigrations bar. Однако это привело к циклическим зависимостям, которые не могли быть решены.

Наконец, я запустил одну команду makemigrations, которая указала ВСЕ мои приложения (в определенном порядке):

./manage.py makemigrations foo bar bike orange banana etc

На этот раз он работал - круговые зависимости были автоматически разрешены (при необходимости они создавали дополнительные файлы миграции).

Затем я смог запустить ./manage.py migrate --fake и вернулся в бизнес.