Назад | Перейти на главную страницу

Проблемы с доступом к базе данных с Django и MySQL

У меня есть апач и mod_wsgi и теперь я пытаюсь внедрить Django в MySQL.

Я создал базу данных с именем «django» и пользователем «django»; и я предоставил все django на django:

grant ALL on django.* to 'django'@'localhost';

Django settings.py был настроен с настройками MySQL:

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql', # Add 'postgresql_psycopg2', 'postgresql', 'mysql', 'sqlite3' or 'oracle'.
        'django': '',                      # Or path to database file if using sqlite3.
        'django': '',                      # Not used with sqlite3.
        '<a password>': '',                  # Not used with sqlite3.
        '': '',                      # Set to empty string for localhost. Not used with sqlite3.
        '': '',                      # Set to empty string for default. Not used with sqlite3.
    }
}

Однако когда я пытаюсь запустить syncdb (python manage.py syncdb) Я получил:

raceback (most recent call last):
  File "manage.py", line 14, in <module>
    execute_manager(settings)
  File "/usr/lib/python2.6/site-packages/django/core/management/__init__.py", line 438, in execute_manager
    utility.execute()
  File "/usr/lib/python2.6/site-packages/django/core/management/__init__.py", line 379, in execute
    self.fetch_command(subcommand).run_from_argv(self.argv)
  File "/usr/lib/python2.6/site-packages/django/core/management/base.py", line 191, in run_from_argv
    self.execute(*args, **options.__dict__)
  File "/usr/lib/python2.6/site-packages/django/core/management/base.py", line 219, in execute
    self.validate()
  File "/usr/lib/python2.6/site-packages/django/core/management/base.py", line 249, in validate
    num_errors = get_validation_errors(s, app)
  File "/usr/lib/python2.6/site-packages/django/core/management/validation.py", line 102, in get_validation_errors
    connection.validation.validate_field(e, opts, f)
  File "/usr/lib/python2.6/site-packages/django/db/backends/mysql/validation.py", line 14, in validate_field
    db_version = self.connection.get_server_version()
  File "/usr/lib/python2.6/site-packages/django/db/backends/mysql/base.py", line 338, in get_server_version
    self.cursor()
  File "/usr/lib/python2.6/site-packages/django/db/backends/__init__.py", line 250, in cursor
    cursor = self.make_debug_cursor(self._cursor())
  File "/usr/lib/python2.6/site-packages/django/db/backends/mysql/base.py", line 322, in _cursor
    self.connection = Database.connect(**kwargs)
  File "/usr/lib/python2.6/site-packages/MySQLdb/__init__.py", line 81, in Connect
    return Connection(*args, **kwargs)
  File "/usr/lib/python2.6/site-packages/MySQLdb/connections.py", line 187, in __init__
    super(Connection, self).__init__(*args, **kwargs2)
_mysql_exceptions.OperationalError: (1045, "Access denied for user 'ec2-user'@'localhost' (using password: NO)")

Последняя строчка сбила меня с толку. Я не уверен, почему он пытается подключиться как ec2-user вместо того Django.

Вы знаете, я не уверен, почему по умолчанию используется ec2-user (если только он не является владельцем процесса, на котором запущен Django), но этот файл конфигурации далек от стандарта. Я считаю, что вы хотите:

default': {
        'ENGINE': 'django.db.backends.mysql', # Add 'postgresql_psycopg2', 'postgresql', 'mysql', 'sqlite3' or 'oracle'.
        'NAME':'django',                      # Or path to database file if using sqlite3.
        'USER':'django',                      # Not used with sqlite3.
        'PASSWORD':'<a password>',                  # Not used with sqlite3.
        'HOST': '',                      # Set to empty string for localhost. Not used with sqlite3.
        'PORT': '',                      # Set to empty string for default. Not used with sqlite3.
    }

Первоначально это выглядело так, как будто вместо замены значения "NAME" вы заменили ключ "NAME" (и то же самое для всех других ключей в dict).