【问题标题】:Django app deployed on elastic beanstalk with MySQL RDS - tables never get created使用 MySQL RDS 部署在弹性 beanstalk 上的 Django 应用程序 - 永远不会创建表
【发布时间】:2016-08-04 20:06:42
【问题描述】:

我已按照每个指南和教程为我的 Django 应用程序设置 RDS MySQL。在本地一切正常。当我部署时,我没有收到任何错误。我的网站运行。但是当我尝试访问我设置的 restful 框架,或者我尝试登录管理页面时,我得到一个 ProgrammingError 表明该表不存在(所有表都不存在)。

访问数据库好像没有问题,我所有的RDS环境变量都设置好了,安全组也设置好了等等。我什至可以从我本地的mysql客户端访问数据库,我可以看到数据库中没有表。

我在配置文件中设置了运行“django-admin.py makemigrations”和“django-admin.py migrate”的命令,我什至尝试将其更改为“python manage.py ...”等,这些命令似乎永远不起作用。

当我 ssh 进入我的弹性 beanstalk 环境时,我可以使用“mysql -u my_username”进入 mysql。但是,如果我导航到我的应用程序所在的文件夹,并尝试手动运行“python manage.py makemigrations”,我会得到:django.db.utils.OperationalError: (1045, "Access denied for user 'my_username'@ 'localhost' (使用密码: YES)")

这是我的配置...

requirements.txt

virtualenv==15.0.1
Django==1.9.5
django-compressor==2.0
django-model-utils==2.4
djangorestframework==3.3.2
dj-database-url==0.4.0
gunicorn==19.4.5
MySQL-python==1.2.5
jsonfield==1.0.3

.ebextentions/01_packages.config

packages:
  yum:
    git: []
    gcc: []
    mysql: []
    mysql-devel: []
    python-devel: []

.ebextentions/project.config

container_commands:
  01_makemigrations:
    command: "source /opt/python/run/venv/bin/activate && python manage.py makemigrations --noinput"
    leader_only: true
  02_migrate:
    command: "source /opt/python/run/venv/bin/activate && python manage.py migrate --noinput"
    leader_only: true
  03_createsu:
    command: "source /opt/python/run/venv/bin/activate && python manage.py createsu"
    leader_only: true
  04_collectstatic:
    command: "source /opt/python/run/venv/bin/activate && python manage.py collectstatic --noinput"

settings.py

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': os.environ['RDS_DB_NAME'],
        'USER': os.environ['RDS_USERNAME'],
        'PASSWORD': os.environ['RDS_PASSWORD'],
        'HOST': os.environ['RDS_HOSTNAME'],
        'PORT': os.environ['RDS_PORT'],
    }
}

请帮忙。谢谢!

【问题讨论】:

  • os.environ['RDS_USERNAME']os.environ['RDS_HOSTNAME'] 是什么?你可以发布虚拟值吗?就像你的 rds_username 是 'jhon' post 'doe' 如果它是 'jhon@localhost' post 'doe@localhost'?
  • @MuhammadTahir RDS 环境变量类似于用户名的“mansoorsiddiqui”等。它们不包含“@Localhost”。主机名只是 RDS 端点提供的 URL。我也可以在 MySQL 工作台上使用这些值进行连接。
  • ` "Access denied for user 'my_username'@'localhost' (using password: YES)"`是什么让我想知道。如果它一直是`“用户'my_username'@'IP OF APPLICATION SERVER'的访问被拒绝(使用密码:YES)”`那么这意味着您需要将username@yourappserverip添加到MySQL用户。
  • 也许你仍然可以通过在你的 MySQL 用户中添加 username@localhost 来摆脱错误。

标签: django amazon-web-services amazon-elastic-beanstalk mysql-python amazon-rds


【解决方案1】:

查看是否在 EC2 安全组中为您的弹性 beantalk 配置了 RDS 安全组。它应该是这样的:

EC2 安全组:your-rds-security-group-name、your-Elastic-Beanstalk-Security-Group

【讨论】:

    【解决方案2】:

    确保在迁移和运行时使用相同的设置!

    我遇到了类似的问题,但我发现我在迁移时使用了本地设置(来自 ma​​nage.py)。但是为了运行,我使用了生产设置(在 wsgi.py 中定义)。这意味着迁移了本地数据库,但使用了生产数据库但从未迁移,因此即使迁移命令返回成功,也不会创建表。我不得不更改我的 django.config

    container_commands:
      01_makemigrations:
        command: "source /opt/python/run/venv/bin/activate && python manage.py makemigrations"
        leader_only: true
    
      02_migrate:
        command: "source /opt/python/run/venv/bin/activate && python manage.py migrate"
        leader_only: true
    

    到:

    container_commands:
      01_migrate:
        command: "django-admin migrate"
        leader_only: true
    option_settings:
      aws:elasticbeanstalk:application:environment:
        DJANGO_SETTINGS_MODULE: fund.productionSettings
    

    推荐here

    【讨论】:

      猜你喜欢
      • 2012-05-15
      • 2014-12-29
      • 2016-05-15
      • 2015-06-10
      • 1970-01-01
      • 2016-02-26
      • 2015-01-25
      • 1970-01-01
      • 2019-07-18
      相关资源
      最近更新 更多