Er zijn al soortgelijke vragen voor Zuid, maar ik ben mijn project begonnen met Django 1.7 en gebruik Zuid niet.
Tijdens de ontwikkeling zijn er veel migraties gemaakt, maar de software is nog niet opgeleverd en er is geen database die gemigreerd moet worden. Daarom wil ik de migraties resetten alsof mijn huidige model het origineel was en alle databases opnieuw maken.
Wat is de aanbevolen manier om dat te doen?
EDIT: vanaf Django 1.8 is er een nieuwe opdracht genaamd squashmigrationsdie lost min of meer het hier beschreven probleem op.
Antwoord 1, autoriteit 100%
Ik heb dit. Ik heb dit net ontdekt en het is goed.
-
Eerst, om de migratietabel te wissen:
./manage.py migrate --fake <app-name> zero
-
Verwijder
app-name/migrations/
map of inhoud. -
Maak de migraties:
./manage.py makemigrations <app-name>
-
Ruim uw migraties eindelijk op zonder andere databasewijzigingen aan te brengen:
./manage.py migrate --fake <app-name>
Antwoord 2, autoriteit 26%
In de Django 1.7-versie van migraties is de reset-functionaliteit die vroeger in Zuid zat, komen te vervallen ten gunste van nieuwe functionaliteit voor het ‘verpletteren’ van uw migraties. Dit zou een goede manier moeten zijn om het aantal migraties onder controle te houden.
https://docs.djangoproject.com/en/dev/topics/migrations/ #squashing-migrations
Als je nog steeds echt helemaal opnieuw wilt beginnen, neem ik aan dat je dat nog steeds zou kunnen door de migratietabel leeg te maken en de migraties te verwijderen, waarna je makemigrations
opnieuw zou uitvoeren.
Antwoord 3, autoriteit 16%
Ik had net hetzelfde probleem.
Dit is mijn oplossing.
#!/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"
De opdracht find
: http://unixhelp .ed.ac.uk/CGI/man-cgi?find
Antwoord 4, autoriteit 5%
Ervan uitgaande dat dit uw projectstructuur is,
project_root/
app1/
migrations/
app2/
migrations/
...
manage.py
remove_migrations.py
u kunt het script remove_migrations.py uitvoeren vanaf de hierboven aangegeven plaats om alle migratiebestanden te verwijderen.
#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()
Handmatig verwijderen kan vermoeiend zijn als je een uitgebreid project hebt. Dit heeft mij veel tijd bespaard. Het verwijderen van migratiebestanden is veilig. Ik heb dit een zoveelste keer gedaan zonder problemen te ondervinden… tot nu toe.
Toen ik de migratiemap verwijderde, maakte makemigrations
of migrate
de map echter niet terug voor mij. Het script zorgt ervoor dat de migratiemap met zijn __init__.py
blijft staan en verwijdert alleen de migratiebestanden.
Antwoord 5, autoriteit 4%
- Bestanden verwijderen:
delete_migrations.py (in root van 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 makemigraties
-
./manage.py migreren –fake
OF, u kunt vanuit dit alles migratie schrijven
Antwoord 6, autoriteit 3%
Ik probeer verschillende commando’s en sommige antwoorden helpen me. Alleen deze reeks loste in mijn geval beide verbroken afhankelijkheden in migraties in MYAPP op en reinigde alle eerdere migraties vanaf nul.
Voordat u dit doet, moet u ervoor zorgen dat de database al is gesynchroniseerd (voeg hier bijvoorbeeld geen nieuw modelveld toe of wijzig de meta-opties).
rm -Rf MYAPP/migrations/*
python manage.py makemigrations --empty MYAPP
python manage.py makemigrations
python manage.py migrate --fake MYAPP 0002
Waarbij 0002 het migratienummer is dat is geretourneerd door het laatste makemigration-commando.
Je kunt nu normale migraties uitvoeren / opnieuw migreren omdat migratie 0002 wordt opgeslagen, maar niet wordt weerspiegeld in de reeds gesynchroniseerde database.
Antwoord 7, autoriteit 2%
Als u niet geïnteresseerd bent in eerdere migraties, hoe zit het dan met het verwijderen van alle migraties in de map migraties/? u begint de migratiereeks helemaal opnieuw, waarbij u uw huidige model als referentie neemt alsof u het hele model nu had geschreven.
Als je me niet genoeg vertrouwt om ze te verwijderen, probeer ze dan weg te halen.
Antwoord 8
Een eenvoudige manier is
Ga naar elke app en verwijder de migratiebestanden.
Ga dan naar de django-migrtaions-tabel in de database en kap deze af (wis alle vermeldingen).
Daarna kunt u opnieuw migraties maken.
Antwoord 9
cd naar src map
cd /path/to/src
migratiemappen verwijderen
rm -rf your_app/migrations/
merk op dat dit voor elke app afzonderlijk moet worden gedaan
migreren
python3.3 manage.py migrate
als je opnieuw wilt beginnen
python3.3 manage.py makemigrations your_app
Antwoord 10
Als je in de ontwikkelingsmodus bent en je wilt gewoon alles resetten (database, migraties, enz.), gebruik ik dit script op basis van Abdelhamid Ba’s antwoord. Dit zal de tabellen van de database wissen (Postgres), alle migratiebestanden verwijderen, de migraties opnieuw uitvoeren en mijn initiële armaturen laden:
#!/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-bestand:
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 $$;
migratie.sh-bestand:
#!/usr/bin/env bash
cd ../../src
./manage.py makemigrations
./manage.py migrate
load_initial_fixtures.sh bestand:
#!/usr/bin/env bash
cd ../../src
./manage.py loaddata ~/path-to-fixture/fixture.json
Zorg er wel voor dat u de paden wijzigt zodat ze overeenkomen met uw app. Ik heb deze scripts persoonlijk in een map met de naam project_root/script/local, en de bronnen van django bevinden zich in project_root/src.
Antwoord 11
Na het verwijderen van elke map “migraties” in mijn app (handmatig), heb ik het volgende uitgevoerd:
./manage.py dbshell
delete from django_migrations;
Toen dacht ik dat ik gewoon ./manage.py makemigrations
kon doen om ze allemaal opnieuw te genereren. Er zijn echter geen wijzigingen geconstateerd. Ik heb toen geprobeerd om één app tegelijk te specificeren: ./manage.py makemigrations foo
, ./manage.py makemigrations bar
. Dit resulteerde echter in circulaire afhankelijkheden die niet konden worden opgelost.
Eindelijk heb ik een enkele makemigration-opdracht uitgevoerd die AL mijn apps specificeerde (in willekeurige volgorde):
./manage.py makemigrations foo bar bike orange banana etc
Deze keer werkte het – circulaire afhankelijkheden werden automatisch opgelost (er werden waar nodig extra migratiebestanden gemaakt).
Toen kon ik ./manage.py migrate --fake
uitvoeren en was ik weer aan het werk.