【问题标题】:Trouble Migrating database schema to Heroku (Postgres)将数据库模式迁移到 Heroku (Postgres) 时遇到问题
【发布时间】:2017-05-24 05:34:12
【问题描述】:

我在本地环境中设置了所有内容,并且在 Heroku 服务器上设置了我网站的代码,但我在将架构迁移到 Heroku 服务器上的 PostgreSQL 数据库时遇到了严重的问题。每当我尝试heroku run python manage.py migrate 时,我都会得到以下信息(这将是初始迁移):

    Running python manage.py migrate on baseballstatview... up, run.1653      (Free)
    Operations to perform:
    Apply all migrations: admin, auth, contenttypes, sessions, statview
    Running migrations:
      Applying contenttypes.0001_initial... OK
      Applying auth.0001_initial... OK
      Applying admin.0001_initial... OK
      Applying admin.0002_logentry_remove_auto_add... OK
      Applying contenttypes.0002_remove_content_type_name... OK
      Applying auth.0002_alter_permission_name_max_length... OK
      Applying auth.0003_alter_user_email_max_length... OK
      Applying auth.0004_alter_user_username_opts... OK
      Applying auth.0005_alter_user_last_login_null... OK
      Applying auth.0006_require_contenttypes_0002... OK
      Applying auth.0007_alter_validators_add_error_messages... OK
      Applying auth.0008_alter_user_username_max_length... OK
      Applying sessions.0001_initial... OK
      Applying statview.0001_initial... OK

这看起来不错,但是使用 heroku pg:info 它告诉我我有 0 个表,甚至当我运行 heroku run python manage.py showmigrations 时,这就是我得到的:

    Running python manage.py showmigrations on baseballstatview... up, run.5059 (Free)
    admin
     [ ] 0001_initial
     [ ] 0002_logentry_remove_auto_add
    auth
     [ ] 0001_initial
     [ ] 0002_alter_permission_name_max_length
     [ ] 0003_alter_user_email_max_length
     [ ] 0004_alter_user_username_opts
     [ ] 0005_alter_user_last_login_null
     [ ] 0006_require_contenttypes_0002
     [ ] 0007_alter_validators_add_error_messages
     [ ] 0008_alter_user_username_max_length
    contenttypes
     [ ] 0001_initial
     [ ] 0002_remove_content_type_name
    sessions
     [ ] 0001_initial
    statview
     [ ] 0001_initial

因此,迁移似乎没有通过,我想知道为什么会这样。数据库为空,我已尝试重置它并再次尝试,但似乎没有任何效果。

编辑:下面是相关的settings.pyfor dj_database_url:

DATABASES = {
'default': {
    'ENGINE': 'django.db.backends.postgresql_psycopg2',
    'NAME': 'mlb_data',
    'USER': 'postgres',
    'PASSWORD': 'pw',
    'HOST': 'localhost',
    'PORT': '5432',
 }
}

import dj_database_url

DATABASES['default'] = dj_database_url.config()

SECURE_PROXY_SSL_HEADER = ('HTTP_X_FORWARDED_PROTO', 'https')

ALLOWED_HOSTS = ['*']

DEBUG = False

try:
    from .local_settings import *
except ImportError:
    pass

【问题讨论】:

  • 您的数据库是如何定义的?你在用dj-database-url吗?
  • @Chris 是的,我是
  • 你在local_settings中有什么吗?它会覆盖数据库设置吗?
  • @thumbtack_5,您在 Heroku 上的 DATABASE_URL 环境变量是什么(确保清理它以删除实际的主机、数据库名称、用户和密码)?我意识到这只是对所有东西进行了消毒,但我们需要看到它。
  • @DanielRoseman @Chris 感谢您的意见。看来我的local_settings.py 覆盖了settings.py

标签: python django postgresql heroku database-migration


【解决方案1】:

从您的代码 sn-p 中可以看出,您在尝试引入本地设置之前正在加载 dj_database_url 配置。这就是问题。这里发生的情况是您的本地设置覆盖了生产设置(使用 Postgres)。

运行迁移时发生的情况是:

  • Heroku 正在创建一个新的本地 SQLite 数据库。
  • 进行迁移。
  • 说成功了。
  • 正在退出。

如果您将本地设置内容移到您的 db_database_url 调用之上,那么事情应该开始为您神奇地工作!

【讨论】:

  • 是的,你是对的。我实际上最终留下了settings.py,并从远程服务器中删除了local_settings.py,它本不应该在。这样开发服务器仍然设置为local_settings.py,但远程不是。
  • 完美!太棒了=D
猜你喜欢
  • 2021-10-16
  • 2011-10-19
  • 2013-11-13
  • 1970-01-01
  • 2015-09-10
  • 2018-01-27
  • 2011-11-30
  • 1970-01-01
  • 2018-11-26
相关资源
最近更新 更多