C'est ce que j'ai fait:
Localement - où j'ai une toute nouvelle base de données postgres et deux fichiers models.py de deux applications différentes:
python manage.py syncdb
python manage.py schemamigration api --initial
python manage.py schemamigration extapi --initial
python manage.py migrate api 0001 --fake
python manage.py migrate extapi 0001 --fake
Cela fonctionne bien, et je peux très bien ajouter des éléments à la base de données.
Ensuite, lors de l'envoi de Heroku, où j'ai déjà créé une application vide:
git add .
git commit -m "Ready to go to Heroku"
git Push heroku master
heroku run python manage.py syncdb
Cela donne ceci:
Running `python manage.py syncdb` attached to terminal... up, run.9548
Syncing...
Creating tables ...
Creating table Django_admin_log
Creating table auth_permission
Creating table auth_group_permissions
Creating table auth_group
Creating table auth_user_groups
Creating table auth_user_user_permissions
Creating table auth_user
Creating table Django_content_type
Creating table Django_session
Creating table south_migrationhistory
# create superuser Prompt...
Superuser created successfully.
Installing custom SQL ...
Installing indexes ...
Installed 0 object(s) from 0 fixture(s)
Synced:
> Django.contrib.admin
> Django.contrib.auth
> Django.contrib.contenttypes
> Django.contrib.sessions
> Django.contrib.messages
> Django.contrib.staticfiles
> south
> rest_framework
Not synced (use migrations):
- api
- extapi
Ensuite, j'essaie de migrer ces applications avec heroku run python manage.py migrate
et j'obtiens cette erreur:
Running `python manage.py migrate` attached to terminal... up, run.3724
Running migrations for api:
- Migrating forwards to 0001_initial.
> api:0001_initial
FATAL ERROR - The following SQL query failed: ALTER TABLE "api_song" ADD CONSTRAINT "summary_id_refs_id_36bb6e06" FOREIGN KEY ("summary_id") REFERENCES "extapi_summary" ("id") DEFERRABLE INITIALLY DEFERRED;
The error was: relation "extapi_summary" does not exist
Error in migration: api:0001_initial
Traceback (most recent call last):
File "manage.py", line 10, in <module>
execute_from_command_line(sys.argv)
File "/app/.heroku/python/lib/python2.7/site-packages/Django/core/management/__init__.py", line 399, in execute_from_command_line
utility.execute()
File "/app/.heroku/python/lib/python2.7/site-packages/Django/core/management/__init__.py", line 392, in execute
self.fetch_command(subcommand).run_from_argv(self.argv)
File "/app/.heroku/python/lib/python2.7/site-packages/Django/core/management/base.py", line 242, in run_from_argv
self.execute(*args, **options.__dict__)
File "/app/.heroku/python/lib/python2.7/site-packages/Django/core/management/base.py", line 285, in execute
output = self.handle(*args, **options)
File "/app/.heroku/python/lib/python2.7/site-packages/south/management/commands/migrate.py", line 111, in handle
ignore_ghosts = ignore_ghosts,
File "/app/.heroku/python/lib/python2.7/site-packages/south/migration/__init__.py", line 220, in migrate_app
success = migrator.migrate_many(target, workplan, database)
File "/app/.heroku/python/lib/python2.7/site-packages/south/migration/migrators.py", line 254, in migrate_many
result = migrator.__class__.migrate_many(migrator, target, migrations, database)
File "/app/.heroku/python/lib/python2.7/site-packages/south/migration/migrators.py", line 329, in migrate_many
result = self.migrate(migration, database)
File "/app/.heroku/python/lib/python2.7/site-packages/south/migration/migrators.py", line 133, in migrate
result = self.run(migration, database)
File "/app/.heroku/python/lib/python2.7/site-packages/south/migration/migrators.py", line 114, in run
return self.run_migration(migration, database)
File "/app/.heroku/python/lib/python2.7/site-packages/south/migration/migrators.py", line 85, in run_migration
south.db.db.execute_deferred_sql()
File "/app/.heroku/python/lib/python2.7/site-packages/south/db/generic.py", line 318, in execute_deferred_sql
self.execute(sql)
File "/app/.heroku/python/lib/python2.7/site-packages/south/db/generic.py", line 282, in execute
cursor.execute(sql, params)
File "/app/.heroku/python/lib/python2.7/site-packages/Django/db/backends/util.py", line 53, in execute
return self.cursor.execute(sql, params)
File "/app/.heroku/python/lib/python2.7/site-packages/Django/db/utils.py", line 99, in __exit__
six.reraise(dj_exc_type, dj_exc_value, traceback)
File "/app/.heroku/python/lib/python2.7/site-packages/Django/db/backends/util.py", line 53, in execute
return self.cursor.execute(sql, params)
Django.db.utils.ProgrammingError: relation "extapi_summary" does not exist
Pour moi, il semblerait que les tables ne soient tout simplement pas créées, mais je ne sais pas pourquoi. Lorsque je lance heroku run python manage.py sqlall
, il est indiqué que tout a été créé, mais ensuite, si je regarde la base de données elle-même (celle que heroku crée sur s3), rien ne se trouve dans app_one et app_two. Encore une fois, tout fonctionne parfaitement localement, c’est juste au moment où le problème se dégrade que les choses se détériorent.
Il y a une importation circulaire qui aurait dû être gérée en différant simplement la création de api_userprofile, mais à cause de la façon dont South gère les transactions, cela se rompt.
Alors! La façon la plus simple de faire ce travail est d’obtenir syncdb pour créer toutes les tables et simuler la migration:
python manage.py syncdb --all
Cela nous amène:
Synced:
> Django.contrib.admin
> Django.contrib.auth
> Django.contrib.contenttypes
> Django.contrib.sessions
> Django.contrib.messages
> Django.contrib.staticfiles
> api
> extapi
> moodranker
> recommender
> south
> rest_framework
Not synced (use migrations):
-
Puis simulons les migrations:
python manage.py migrate --fake
Supprimez votre dossier de migration puis faites
python manage.py makemigrations appname
python manage.py migrate --run-syncdb
python manage.py migrate --fake appname