尝试了解我已部署到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
为什么我的应用似乎正在迁移但实际上并没有这样做?我假设迁移文件存在一些问题,但我不明白它是如何或为什么开发的。感谢