Как упростить миграцию в 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))
-
DELETE FROM django_migrations Where app in ('app1', 'app2');
-
./manage.py makemigrations
-
./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
и вернулся в бизнес.