如何让 South 在 Heroku 中为 Django 应用程序工作
Posted
技术标签:
【中文标题】如何让 South 在 Heroku 中为 Django 应用程序工作【英文标题】:How to make South works in Heroku for a Django app 【发布时间】:2012-04-01 05:06:48 【问题描述】:我正在研究 Python/Django,我正在尝试使用 South 来管理我的数据库。在当地环境中工作得很好。当我部署到 Heroku 时,问题就来了。问题是当我使用
创建迁移时$heroku run manage.py schemamigration mydjangoapp
看起来它可以工作(shell 确认它),但是,然后我尝试使用迁移,它不会工作。当我这样做时:
$heroku run python manage.py migrate mydjangoapp
我明白了;
The app 'createtuto' does not appear to use migrations
我检查了这个问题,看起来 heroku 不允许 South 在 /myDjangoapp/migrations 处创建迁移目录。
有什么我可以做的吗?
我尝试使用 convert_to_south,但得到了相同的结果:一开始它看起来有效,但它没有,没有创建迁移。
【问题讨论】:
你为什么要在 Heroku 上创建迁移? Heroku 应该只是您使用原始代码的生产环境。所有这些东西都应该在你的本地开发环境中完成。 @ChrisPratt 你在说什么?您希望您的生产应用程序随着时间的推移如何发展? @HorseloverFat:您永远不会针对生产运行迁移。您在本地迁移架构。测试更改。然后生成或编写 SQL 以在生产中进行这些更改,如果您的组织有 DBA,最好在 DBA 的协助下进行。如果您自己做所有事情,最好应用 SQL,而不是盲目迁移,因为这样您可以在进行更改之前仔细检查将应用于数据库的确切更改。 @ChrisPratt 您可能是对的,但这仅可能发生在 a) 具有小型数据库的站点,b) 具有巨额预算的站点,或 c) 具有自定义(非 ORM 生成)表的站点.诸如此类的任何工具的目的都是赋予一两个开发人员很大的权力;这确实有风险,因为人们必须相信这个工具,但这并不会使提出这个问题变得荒谬。 【参考方案1】:当您运行“heroku run”时,它会连接到已部署环境的隔离实例。它确实创建了迁移,但是迁移不包含在您的 slug 中。每次您执行“git push heroku master”时,它都会安装您的依赖项并将您的应用程序打包成一个 slug。这或多或少是您的应用程序的 tarball,它使 Heroku 能够在您扩大规模时轻松地将其部署到新的 dynos。
为了在 Heroku 上运行迁移,您需要在本地创建迁移,签入,然后在 heroku 上运行迁移。类似于:
manage.py schemamigration mydjangoapp
git add mydjangoapp/migrations/*
git commit -m 'adding new migrations'
git push heroku master
heroku run python manage.py migrate mydjangoapp
【讨论】:
不,它没有用。当我尝试你的建议时,我得到了这个: !在实际运行迁移过程中发现错误!中止。 -------------- !由于您有一个不支持运行的数据库!交易中的模式改变语句,我们有!使其处于迁移之间的临时状态。 ------------------------- 目前我唯一的选择是备份数据库并执行“manage.py reset myapp”,然后再次执行“syncdb”并从备份中恢复。【参考方案2】:我在这里成功地遵循了 Mike Ball 的指示: http://www.mikeball.us/blog/using-south-on-heroku/
就像 CraigKerstiens 回答说的那样,您应该先在本地进行迁移,然后再推送到 heroku。在 Heroku 上进行迁移之前,请确保将 Heroku 实例转换为南,例如
heroku run bin/python django_project/manage.py convert_to_south django_app
【讨论】:
我将补充一点(因为无法对您链接的博客发表评论),我必须先在本地和 Heroku 上进行虚假迁移。以上是关于如何让 South 在 Heroku 中为 Django 应用程序工作的主要内容,如果未能解决你的问题,请参考以下文章
使用 South 在 Heroku 上设置 Django 时遇到问题 - 不断出现 ProgrammingError:关系不存在
如何让 South 在 PythonAnywhere 上工作?