Hoe migraties vereenvoudigen in Django 1.7?

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 makemigrationsopnieuw 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 makemigrationsof migratede map echter niet terug voor mij. Het script zorgt ervoor dat de migratiemap met zijn __init__.pyblijft staan ​​en verwijdert alleen de migratiebestanden.


Antwoord 5, autoriteit 4%

  1. 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))
  1. DELETE FROM django_migrations Where app in ('app1', 'app2');

  2. ./manage.py makemigraties

  3. ./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 makemigrationskon 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 --fakeuitvoeren en was ik weer aan het werk.

Other episodes