Django 1.6.1 中本地设置与数据库同步后未应用

39 阅读1分钟

在使用 Django 1.6.1 与数据库同步后,发现本地设置并没有被应用。 现象:

本地设置 :

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'test_kidsmamma',
        'USER': 'test',
        'PASSWORD': 'test@pass!@#$',
        'HOST': '',
        'PORT': '',
        'TEST_COLLATION': 'utf8_unicode_ci'
    }
}

主设置 :

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'kidsmamma',
        'USER': 'kidsmamma',
        'PASSWORD': 'kidsmamma@pass!@#$',
        'HOST': '',
        'PORT': '',
        'TEST_COLLATION': 'utf8_unicode_ci'
    }
}

当使用 ./manage.py shell 命令时,可以正确看到本地设置已被应用:

{'default': {'ENGINE': 'django.db.backends.mysql', 'NAME': 'test_kidsmamma', 'test_COLLATION': 'utf8_unicode_ci', 'HOST': '', 'USER': 'test', 'PASSWORD': 'test@pass!@#$', 'PORT': ''}}

但是,当使用 ./manage.py syncdb 命令与数据库同步后,却发生了错误:

Traceback (most recent call last):
  File "./manage.py", line 10, in <module>
    execute_from_command_line(sys.argv)
  File "/home/kidsmamma/.virtualenvs/kidsmamma/local/lib/python2.7/site-packages/django/core/management/__init__.py", line 399, in execute_from_command_line
utility.execute()
  File "/home/kidsmamma/.virtualenvs/kidsmamma/local/lib/python2.7/site-packages/django/core/management/__init__.py", line 392, in execute
    self.fetch_command(subcommand).run_from_argv(self.argv)
  File "/home/kidsmamma/.virtualenvs/kidsmamma/local/lib/python2.7/site-packages/django/core/management/base.py", line 242, in run_from_argv
    self.execute(*args, **options.__dict__)
  File "/home/kidsmamma/.virtualenvs/kidsmamma/local/lib/python2.7/site-packages/django/core/management/base.py", line 285, in execute
    output = self.handle(*args, **options)
  File "/home/kidsmamma/.virtualenvs/kidsmamma/local/lib/python2.7/site-packages/django/core/management/base.py", line 415, in handle
    return self.handle_noargs(**options)
  File "/home/kidsmamma/.virtualenvs/kidsmamma/local/lib/python2.7/site-packages/south/management/commands/syncdb.py", line 89, in handle_noargs
    db.connection_init() 
  File "/home/kidsmamma/.virtualenvs/kidsmamma/local/lib/python2.7/site-packages/south/db/mysql.py", line 183, in connection_init
    cursor = self._get_connection().cursor()
  File "/home/kidsmamma/.virtualenvs/kidsmamma/local/lib/python2.7/site-packages/django/db/backends/__init__.py", line 157, in cursor
    cursor = self.make_debug_cursor(self._cursor())
  File "/home/kidsmamma/.virtualenvs/kidsmamma/local/lib/python2.7/site-packages/django/db/backends/__init__.py", line 129, in _cursor
    self.ensure_connection()
  File "/home/kidsmamma/.virtualenvs/kidsmamma/local/lib/python2.7/site-packages/django/db/backends/__init__.py", line 124, in ensure_connection
    self.connect()
  File "/home/kidsmamma/.virtualenvs/kidsmamma/local/lib/python2.7/site-packages/django/db/utils.py", line 99, in __exit__
    six.reraise(dj_exc_type, dj_exc_value, traceback)
  File "/home/kidsmamma/.virtualenvs/kidsmamma/local/lib/python2.7/site-packages/django/db/backends/__init__.py", line 124, in ensure_connection
    self.connect()
  File "/home/kidsmamma/.virtualenvs/kidsmamma/local/lib/python2.7/site-packages/django/db/backends/__init__.py", line 112, in connect
    self.connection = self.get_new_connection(conn_params)
  File "/home/kidsmamma/.virtualenvs/kidsmamma/local/lib/python2.7/site-packages/django/db/backends/mysql/base.py", line 435, in get_new_connection
    conn = Database.connect(**conn_params)
  File "/home/kidsmamma/.virtualenvs/kidsmamma/local/lib/python2.7/site-packages/MySQLdb/__init__.py", line 81, in Connect
    return Connection(*args, **kwargs)
  File "/home/kidsmamma/.virtualenvs/kidsmamma/local/lib/python2.7/site-packages/MySQLdb/connections.py", line 193, in __init__
    super(Connection, self).__init__(*args, **kwargs2)
django.db.utils.OperationalError: (1045, "Access denied for user 'kidsmamma'@'localhost' (using password: YES)")

问题:

  1. 当我尝试使用 ./manage.py syncdb 命令与数据库同步时,本地设置未被应用,而是使用了主设置中的数据库连接信息。
  2. 当我尝试不使用本地设置连接数据库时,则没有问题。
  3. 我在 Django 版本 1.6.1 中遇到这个问题。

2、解决方案

要解决这个问题,需要确保在同步数据库时使用的是本地设置中的数据库连接信息。

可以通过以下方式实现:

# Import the local settings file
from local_settings import *

# Override the default database settings with the local settings
DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': DB_NAME,
        'USER': DB_USER,
        'PASSWORD': DB_PASSWORD,
        'HOST': DB_HOST,
        'PORT': DB_PORT,
        'TEST_COLLATION': 'utf8_unicode_ci'
    }
}

这样,在同步数据库时,就会使用本地设置中的数据库连接信息,从而避免出现上述问题。

代码示例:

# Import the local settings file
from local_settings import *

# Override the default database settings with the local settings
DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'test_kidsmamma',
        'USER': 'test',
        'PASSWORD': 'test@pass!@#$',
        'HOST': '',
        'PORT': '',
        'TEST_COLLATION': 'utf8_unicode_ci'
    }
}

现在,当你运行 ./manage.py syncdb 命令时,本地设置中的数据库连接信息就会被使用,从而避免出现上述问题。