heroku django.db.utils.ProgrammingError:迁移后列foo.foo_id不存在

时间:2018-03-02 16:37:08

标签: django heroku django-models django-migrations heroku-postgres

尝试了解我已部署到heroku的应用程序的数据库行为。没有错误的部署。

确保我开始使用干净的db:

$ heroku pg:reset 
$ heroku .. manage.py makemigrations -a fooapp

db将makemigrations,但表示:

You are trying to add a non-nullable field 'foo' to foo without a default; we can't do that (the database needs something to populate existing rows). 

Please select a fix: 
1) Provide a one-off default now (will be set on all existing rows with a null value for this column)
2) Quit, and let me add a default in models.py

我一直在选择'1'给它一个默认值,然后makemigrations运行并完成,我看到应用了新的迁移。

然后我迁移,并且迁移似乎成功运行(每个表的每个migraiton都是“OK”),包括foo表。

但请求除/ admin视图以外的任何应用视图会引发此错误,例如:

Mar 02 08:58:18 fooapp heroku/router: at=info method=GET path="/" host=fooapp.com request_id=f79c8541-d2a1-47ea-914b-4f71f84d5f66 fwd="67.87.56.80" dyno=web.1 connect=1ms service=411ms status=500 bytes=11376 protocol=https 
Mar 02 08:58:18 fooapp app/worker.1: 2018-03-02 16:58:17 [4] [ERROR] pathname=/app/.heroku/python/lib/python3.6/site-packages/django/core/handlers/exception.py lineno=135 funcname=handle_uncaught_exception Internal Server Error: /

日志:

    The above exception was the direct cause of the following exception: 
Mar 02 08:21:28 fooapp app/worker.1: Traceback (most recent call last): 
Mar 02 08:21:28 fooapp app/worker.1:   File "/app/.heroku/python/lib/python3.6/site-packages/django/core/handlers/exception.py", line 41, in inner 
Mar 02 08:21:28 fooapp app/worker.1:     response = get_response(request) 
Mar 02 08:21:28 fooapp app/worker.1:   File "/app/.heroku/python/lib/python3.6/site-packages/django/core/handlers/base.py", line 249, in _legacy_get_response 
Mar 02 08:21:28 fooapp app/worker.1:     response = self._get_response(request) 
Mar 02 08:21:28 fooapp app/worker.1:   File "/app/.heroku/python/lib/python3.6/site-packages/django/core/handlers/base.py", line 187, in _get_response 
Mar 02 08:21:28 fooapp app/worker.1:     response = self.process_exception_by_middleware(e, request) 
Mar 02 08:21:28 fooapp app/worker.1:   File "/app/.heroku/python/lib/python3.6/site-packages/channels/handler.py", line 237, in process_exception_by_middleware 
Mar 02 08:21:28 fooapp app/worker.1:     return super(AsgiHandler, self).process_exception_by_middleware(exception, request) 
Mar 02 08:21:28 fooapp app/worker.1:   File "/app/.heroku/python/lib/python3.6/site-packages/django/core/handlers/base.py", line 185, in _get_response 
Mar 02 08:21:28 fooapp app/worker.1:     response = wrapped_callback(request, *callback_args, **callback_kwargs) 
Mar 02 08:21:28 fooapp app/worker.1:   File "/app/.heroku/python/lib/python3.6/contextlib.py", line 52, in inner 
Mar 02 08:21:28 fooapp app/worker.1:     return func(*args, **kwds) 
Mar 02 08:21:28 fooapp app/worker.1:   File "/app/project/utils/helpers.py", line 28, in _decorated 
Mar 02 08:21:28 fooapp app/worker.1:     return view(request, *args, **kwargs) 
Mar 02 08:21:28 fooapp app/worker.1:   File "/app/causes/views.py", line 47, in frontpage 
Mar 02 08:21:28 fooapp app/worker.1:     activities = CauseActivity.sort_activities(activities) 
Mar 02 08:21:28 fooapp app/worker.1:   File "/app/causes/models.py", line 348, in sort_activities 
Mar 02 08:21:28 fooapp app/worker.1:     return sorted(activities, key=lambda x: random.random()) 
Mar 02 08:21:28 fooapp app/worker.1:   File "/app/.heroku/python/lib/python3.6/site-packages/django/db/models/query.py", line 250, in __iter__ 
Mar 02 08:21:28 fooapp app/worker.1:     self._fetch_all() 
Mar 02 08:21:28 fooapp app/worker.1:   File "/app/.heroku/python/lib/python3.6/site-packages/django/db/models/query.py", line 1118, in _fetch_all 
Mar 02 08:21:28 fooapp app/worker.1:     self._result_cache = list(self._iterable_class(self)) 
Mar 02 08:21:28 fooapp app/worker.1:   File "/app/.heroku/python/lib/python3.6/site-packages/django/db/models/query.py", line 53, in __iter__ 
Mar 02 08:21:28 fooapp app/worker.1:     results = compiler.execute_sql(chunked_fetch=self.chunked_fetch) 
Mar 02 08:21:28 fooapp app/worker.1:   File "/app/.heroku/python/lib/python3.6/site-packages/django/db/models/sql/compiler.py", line 899, in execute_sql 
Mar 02 08:21:28 fooapp app/worker.1:     raise original_exception 
Mar 02 08:21:28 fooapp app/worker.1:   File "/app/.heroku/python/lib/python3.6/site-packages/django/db/models/sql/compiler.py", line 889, in execute_sql 
Mar 02 08:21:28 fooapp app/worker.1:     cursor.execute(sql, params) 
Mar 02 08:21:28 fooapp app/worker.1:   File "/app/.heroku/python/lib/python3.6/site-packages/django/db/backends/utils.py", line 64, in execute 
Mar 02 08:21:28 fooapp app/worker.1:     return self.cursor.execute(sql, params) 
Mar 02 08:21:28 fooapp app/worker.1:   File "/app/.heroku/python/lib/python3.6/site-packages/django/db/utils.py", line 94, in __exit__ 
Mar 02 08:21:28 fooapp app/worker.1:     six.reraise(dj_exc_type, dj_exc_value, traceback) 
Mar 02 08:21:28 fooapp app/worker.1:   File "/app/.heroku/python/lib/python3.6/site-packages/django/utils/six.py", line 685, in reraise 
Mar 02 08:21:28 fooapp app/worker.1:     raise value.with_traceback(tb) 
Mar 02 08:21:28 fooapp app/worker.1:   File "/app/.heroku/python/lib/python3.6/site-packages/django/db/backends/utils.py", line 64, in execute 
Mar 02 08:21:28 fooapp app/worker.1:     return self.cursor.execute(sql, params) 
Mar 02 08:21:28 fooapp app/worker.1: django.db.utils.ProgrammingError: column foo.foo_id does not exist 
Mar 02 08:21:28 fooapp app/worker.1: LINE 1: SELECT "foo"."id", "foo"."... 

即使我认为我在上面提到的makemigrations步骤中手动为foo指定了默认值。

$ heroku run python manage.py showmigrations -a fooapp

account
 [X] 0001_initial
 [X] 0002_email_max_length
admin
 [X] 0001_initial
 [X] 0002_logentry_remove_auto_add
auth
 [X] 0001_initial
 [X] 0002_alter_permission_name_max_length
 [X] 0003_alter_user_email_max_length
 [X] 0004_alter_user_username_opts
 [X] 0005_alter_user_last_login_null
 [X] 0006_require_contenttypes_0002
 [X] 0007_alter_validators_add_error_messages
 [X] 0008_alter_user_username_max_length
foo
 [X] 0001_initial
common
 [X] 0001_initial
bar
 [X] 0001_initial
contenttypes
 [X] 0001_initial
 [X] 0002_remove_content_type_name
geo
 (no migrations)
sessions
 [X] 0001_initial
sites
 [X] 0001_initial
 [X] 0002_alter_domain_unique
socialaccount
 [X] 0001_initial
 [X] 0002_token_max_lengths
 [X] 0003_extra_data_default_dict
users
 [X] 0001_initial

为什么我的应用似乎正在迁移但实际上并没有这样做?我假设迁移文件存在一些问题,但我不明白它是如何或为什么开发的。感谢

0 个答案:

没有答案