情景
-
假设你有一个项目 A
-
你之前部署了项目 A,里面包含了两个数据库的表 table1 和 table2,他们都顺利部署
-
然后你相加一些功能,于是又创建了一张表 table3
-
于是再部署的时候发现 table3 即使执行了 makemigrations 和 migrate 命令也无法创建成功,但是在 django 的 admin 界面却能够看到 table3,就像下面这样:
-
这里的 userinfo 就是我说的 table3,在 admin 界面能看到,但是你就是无法操作
-
报错的信息如下:
ProgrammingError at /admin/nnsh_backend_new/userinfo/
relation "nnsh_backend_new_userinfo" does not exist
LINE 1: SELECT COUNT(*) AS "__count" FROM "nnsh_backend_new_userinfo...
^
Request Method: GET
Request URL: http://nus-nnsh-backend-new-1fec143342b2.herokuapp.com/admin/nnsh_backend_new/userinfo/
Django Version: 4.0.1
Exception Type: ProgrammingError
Exception Value:
relation "nnsh_backend_new_userinfo" does not exist
LINE 1: SELECT COUNT(*) AS "__count" FROM "nnsh_backend_new_userinfo...
^
Exception Location: /app/.heroku/python/lib/python3.9/site-packages/django/db/backends/utils.py, line 85, in _execute
Python Executable: /app/.heroku/python/bin/python
Python Version: 3.9.16
Python Path:
['.',
'/app/.heroku/python/bin',
'/app',
'/app/.heroku/python/lib/python39.zip',
'/app/.heroku/python/lib/python3.9',
'/app/.heroku/python/lib/python3.9/lib-dynload',
'/app/.heroku/python/lib/python3.9/site-packages']
Server time: Sun, 16 Jul 2023 09:51:46 +0000
原因
-
有一些数据库的冲突发生了,这些冲突可能如下,但远不止下面的情况:
- 你现在改完的版本中某个表多了一些字段,
- 但是在你已有的信息中没有这些字段,这其实就会造成冲突,这样的数据迁移结果会失败
-
一个最粗暴的方法,也是我采用的方法(因为我的数据还在测试阶段,所以不重要),就是直接删除 Heroku 上的项目数据库,然后重新 makemigrations 和 migrate
操作
在你的本地terminal:
-
登录 heroku 远程的账号:
heroku login
-
重置项目数据库:
heroku pg:reset DATABASE_URL --confirm YOUR_APP_NAME
- 如果你的项目只有一个数据库,那么这里的
DATABASE_URL
就保持不变即可,如果有多个数据库,你需要在这里确切地指定DATABASE_URL
是什么 YOUR_APP_NAME
一定要换成自己的 Heroku 项目名称
- 如果你的项目只有一个数据库,那么这里的
-
接下来 手动 或者在 Procfile 中设置 迁移操作:
手动
heroku run python manage.py makemigrations YOUR_PROJECT_NAME
heroku run python manage.py migrate
- 这里的
YOUR_PROJECT_NAME
注意不是上面的YOUR_APP_NAME
;这个是你本地项目文件夹的名称
自动
- 在 Procfile 文件中的第一行写入
release: python manage.py makemigrations YOUR_PROJECT_NAME && python manage.py migrate
- 然后重新
git push
你的 heroku 项目,就会完成迁移的