How would you create a 'manual' django migration?
I've discovered that I can set defaults for columns on a postgres database in a django project using migrations.RunSQL('some sql')
.
I'm currently doing this by adding a column, makemigrations, then removing the column, makemigrations, and then manually modifying the migration file that is produced.
I tried copying an old migration file and then removing the old code so just the new sql could be run and got some strange errors.
CommandError: Conflicting migrations detected; multiple leaf nodes in the migration graph: (0067_auto_20180509_2327, 0068_auto_20180514_0707 in csmu).
To fix them run python manage.py makemigrations --merge
How would you create a 'manual' django migration?
Solution 1:
You can create a manual migration by running the command:
python manage.py makemigrations --name migration_name app_name --empty
Where app_name
corresponds to the app within your project you want to add the migration. Remember Django manages both Project and Apps (A project is a collection of configuration and apps for a particular website. A project can contain multiple apps. An app can be in multiple projects.)
And --empty
flag is to create a migration file where you will have to add your manual migrations.
For example, on a project where you have an app named api
that only has one migration file 0001_initial.py
running:
python manage.py makemigrations api --name migration_example --empty
will create a file named 0002_migration_example.py
under the directory api/migrations/
that will look like:
# Generated by Django 2.2.10 on 2020-05-26 20:37
from django.db import migrations
class Migration(migrations.Migration):
dependencies = [
('api', '0001_initial'),
]
operations = [
]
And you should add migrations.RunSQL('some sql').
inside operations brackets, like:
operations = [
migrations.RunSQL('some sql')
]
Solution 2:
You can learn how to make migrations by investigating the automatically generated migrations, for example:
class Migration(migrations.Migration):
dependencies = [
('app_details', '0001_initial'),
]
operations = [
migrations.AddField(
...,
),
migrations.CreateModel(
...,
),
migrations.RenameModel(
...,
),
migrations.RenameField(
...,
),
migrations.RemoveModel(
...,
),
# and so on
]
Create a manual migration file
use this command in the terminal: python manage.py makemigrations --empty
.
Then add what you want in it.
notice: you have to compose between the "models.py" and the manual migrations.