【发布时间】:2018-07-20 20:17:14
【问题描述】:
我关注了Docker + Django tutorial,这很棒,因为我可以按照说明成功构建和运行网站。但是,我一生都无法弄清楚如何在更改模型后成功运行数据库迁移。
以下是我采取的步骤:
- 克隆关联的git repo
-
设置一个名为
dev的虚拟机- 与
docker-machine create -d virtualbox dev - 并用
eval $(docker-machine env dev)指向它
- 与
-
构建并启动它:
docker-compose build- 和
docker-compose up -d
-
运行初始迁移(我唯一一次能够运行似乎成功的迁移):
docker-compose run web python manage.py migrate
-
通过导航到以下人员返回的 IP 地址检查网站是否正常工作:
docker-machine ip dev
-
对模型进行更改。我刚刚将它添加到 web/docker_django/apps/todo/models.py 文件中的
Item模型中。:name = models.CharField(default='Unnamed', max_length=50, null=False)
-
更新镜像并重启容器:
docker-compose down --volumes- 然后
docker-compose build - 然后
docker-compose up --force-recreate -d
第 1 次迁移尝试:
我用过:
docker-compose run web python manage.py makemigrations todo
然后:
docker-compose run web python manage.py migrate
在makemigrations 命令之后,它说:
Migrations for 'todo':
0001_initial.py:
- Create model Item
当我运行migrate 命令时,它给出了以下消息:
Operations to perform:
Synchronize unmigrated apps: messages, todo, staticfiles
Apply all migrations: contenttypes, admin, auth, sessions
Synchronizing apps without migrations:
Creating tables...
Running deferred SQL...
Installing custom SQL...
Running migrations:
No migrations to apply.
所以那没用。
第 2 次迁移尝试:
这次我尝试直接从正在运行的 Web 容器中运行迁移。这看起来像这样:
(macbook)$ docker exec -it dockerizingdjango_web_1 bash
root@38f9381f179b:/usr/src/app# ls
Dockerfile docker_django manage.py requirements.txt static tests
root@38f9381f179b:/usr/src/app# python manage.py makemigrations todo
Migrations for 'todo':
0001_initial.py:
- Create model Item
root@38f9381f179b:/usr/src/app# python manage.py migrate
Operations to perform:
Synchronize unmigrated apps: staticfiles, messages
Apply all migrations: contenttypes, todo, admin, auth, sessions
Synchronizing apps without migrations:
Creating tables...
Running deferred SQL...
Installing custom SQL...
Running migrations:
Rendering model states... DONE
Applying todo.0001_initial...Traceback (most recent call last):
File "/usr/local/lib/python3.5/site-packages/django/db/backends/utils.py", line 62, in execute
return self.cursor.execute(sql)
psycopg2.ProgrammingError: relation "todo_item" already exists
此外,我在该容器中找不到任何 migrations 文件夹。
我显然不知道这里发生了什么,所以如果有人能告诉我如何成功地更改模型和运行数据库迁移,我将不胜感激。如果你能帮助我概念化当我运行这些必须让 web 和 postgres 图像一起工作的命令时发生了什么,那么加分。
编辑:什么对我有用
@MazelTov 的建议都将有助于自动化流程,因为我越来越习惯于使用 Docker 进行开发,但我缺少的东西,@MazelTov 在一个非常有用的讨论中让我参与,正在安装以便迁移显示在我的本地机器上。
所以基本上,我的 Migration Attempt 1 会工作得很好,如果不是,例如:
docker-compose run web python manage.py makemigrations todo
...我用过:
docker-compose run --service-ports -v $(pwd)/web:/usr/src/app web python manage.py makemigrations todo
【问题讨论】:
标签: django postgresql docker docker-compose