问题
To setup new database on heroku
I tried python manage migrate
and got many exceptions related to relation already exists/does not exists
. So I followed the instructions here django 1.9: ProgrammingError: relation "users_user" does not exist but it didn't work.
~ $ django-admin showmigrations
admin
[ ] 0001_initial
[ ] 0002_logentry_remove_auto_add
auth
[ ] 0001_initial
[ ] 0002_alter_permission_name_max_length
[ ] 0003_alter_user_email_max_length
[ ] 0004_alter_user_username_opts
[ ] 0005_alter_user_last_login_null
[ ] 0006_require_contenttypes_0002
[ ] 0007_alter_validators_add_error_messages
[ ] 0008_alter_user_username_max_length
contenttypes
[ ] 0001_initial
[ ] 0002_remove_content_type_name
dashboard
[ ] 0001_squashed_0024_auto_20161205_2214 (24 squashed migrations)
sessions
[ ] 0001_initial
and when I run migrate
~ $ python manage.py migrate
Operations to perform:
Apply all migrations: admin, auth, contenttypes, dashboard, sessions
Running migrations:
Applying contenttypes.0001_initial... OK
Applying auth.0001_initial... OK
Applying admin.0001_initial... OK
Applying admin.0002_logentry_remove_auto_add... OK
Applying contenttypes.0002_remove_content_type_name... OK
Applying auth.0002_alter_permission_name_max_length... OK
Applying auth.0003_alter_user_email_max_length... OK
Applying auth.0004_alter_user_username_opts... OK
Applying auth.0005_alter_user_last_login_null... OK
Applying auth.0006_require_contenttypes_0002... OK
Applying auth.0007_alter_validators_add_error_messages... OK
Applying auth.0008_alter_user_username_max_length... OK
Applying dashboard.0001_squashed_0024_auto_20161205_2214...Traceback (most recent call last):
File "/app/.heroku/python/lib/python3.5/site-packages/django/db/backends/utils.py", line 64, in execute
return self.cursor.execute(sql, params)
psycopg2.ProgrammingError: relation "dashboard_dashboards" does not exist
The above exception was the direct cause of the following exception:
Traceback (most recent call last):
File "manage.py", line 22, in <module>
execute_from_command_line(sys.argv)
File "/app/.heroku/python/lib/python3.5/site-packages/django/core/management/__init__.py", line 367, in execute_from_command_line
utility.execute()
File "/app/.heroku/python/lib/python3.5/site-packages/django/core/management/__init__.py", line 359, in execute
self.fetch_command(subcommand).run_from_argv(self.argv)
File "/app/.heroku/python/lib/python3.5/site-packages/django/core/management/base.py", line 294, in run_from_argv
self.execute(*args, **cmd_options)
File "/app/.heroku/python/lib/python3.5/site-packages/django/core/management/base.py", line 345, in execute
output = self.handle(*args, **options)
File "/app/.heroku/python/lib/python3.5/site-packages/django/core/management/commands/migrate.py", line 204, in handle
fake_initial=fake_initial,
File "/app/.heroku/python/lib/python3.5/site-packages/django/db/migrations/executor.py", line 115, in migrate
state = self._migrate_all_forwards(state, plan, full_plan, fake=fake, fake_initial=fake_initial)
File "/app/.heroku/python/lib/python3.5/site-packages/django/db/migrations/executor.py", line 145, in _migrate_all_forwards
state = self.apply_migration(state, migration, fake=fake, fake_initial=fake_initial)
File "/app/.heroku/python/lib/python3.5/site-packages/django/db/migrations/executor.py", line 244, in apply_migration
state = migration.apply(state, schema_editor)
File "/app/.heroku/python/lib/python3.5/site-packages/django/db/backends/base/schema.py", line 92, in __exit__
self.execute(sql)
File "/app/.heroku/python/lib/python3.5/site-packages/django/db/backends/base/schema.py", line 112, in execute
cursor.execute(sql, params)
File "/app/.heroku/python/lib/python3.5/site-packages/django/db/backends/utils.py", line 64, in execute
return self.cursor.execute(sql, params)
File "/app/.heroku/python/lib/python3.5/site-packages/django/db/utils.py", line 94, in __exit__
six.reraise(dj_exc_type, dj_exc_value, traceback)
File "/app/.heroku/python/lib/python3.5/site-packages/django/utils/six.py", line 685, in reraise
raise value.with_traceback(tb)
File "/app/.heroku/python/lib/python3.5/site-packages/django/db/backends/utils.py", line 64, in execute
return self.cursor.execute(sql, params)
django.db.utils.ProgrammingError: relation "dashboard_dashboards" does not exist
Here's the relevant part of 0001_squashed_0024_auto_20161205_2214.py
operations = [
migrations.CreateModel(
name='Dashboards',
fields=[
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('dashboard_name', models.CharField(max_length=200, unique=True, verbose_name='Dashboard Name')),
('create_date', models.DateTimeField(auto_now=True, verbose_name='Dashboard Create Date')),
('advisory_end_date', models.DateField(verbose_name='End date of Advisory Process')),
('advisory_start_date', models.DateField(verbose_name='Start date of Advisory Process')),
('number_of_teams', models.IntegerField(verbose_name='Number of teams')),
],
),
migrations.AlterModelOptions(
name='dashboards',
options={'verbose_name': 'Dashboard', 'verbose_name_plural': 'Dashboards'},
),
migrations.RenameModel(
old_name='Dashboards',
new_name='Dashboard',
),
migrations.RenameField(
model_name='dashboard',
old_name='dashboard_name',
new_name='name',
),
migrations.AlterField(
model_name='dashboard',
name='create_date',
field=models.DateTimeField(auto_now_add=True, verbose_name='Dashboard Create Date'),
),
The migrations work fine when run them locally with sqlite3
database but not on heroku
with postgresql
.
回答1:
I had a similar problem myself. The problem of squashing the migrations is that some tables were not created yet, but django tries to access them anyway in order to create the relationships.
There are two things you can do
1) Not squash the migrations
2) Delete the relationship in the migration. Run the makemigration to create the relationship alone and migrate it after.
I'm not sure which line you would have to remove. It's not super clear to me. Could be one of the three choices below, some of them, or all of them.
migrations.RenameModel(
old_name='Dashboards',
new_name='Dashboard',
),
migrations.AlterModelOptions(
name='dashboards',
options={'verbose_name': 'Dashboard', 'verbose_name_plural': 'Dashboards'},
),
migrations.AlterField(
model_name='dashboard',
name='create_date',
field=models.DateTimeField(auto_now_add=True, verbose_name='Dashboard Create Date'),
),
since it is trying to alter one model which was not created yet.
回答2:
This might be helpful for deploying to Heroku. https://ultimatedjango.com/learn-django/lessons/push-to-heroku/
The problem is that on Heroku you need to run migrations before you run the server, so this worked for me.
$ heroku run python manage.py migrate
来源:https://stackoverflow.com/questions/40980717/django-programmingerror-relation-does-not-exists